bash에서 file2가 file1보다 최신인지 확인하는 방법은 무엇입니까?


51

file2이후에 마지막으로 수정 된 것을 어떻게 확인할 수 file1있습니까?

이 예에서는 perl보다 최근에 수정되었습니다 stack. 수정 시간을 기준으로 이러한 파일을 비교할 수있는 bash 또는 Linux 명령이 있습니까?

-rw-r--r--    1 root     root         1577 Sep  7 22:55 stack
-rwxr-xr-x    1 root     root          626 Sep  7 23:10 perl

답변:


51

여기 에서 찾았습니다

for f in /abcd/xyz* do
   [ "$f" -nt /abcd/test.txt ] && echo "file f$ found" done

14
또한 -ot"보다 오래된"입니다.
Dennis Williamson

1
나는 이것에 문제가 있다고 생각합니다. 수정 시간이 초 단위로 동일한 파일의 경우 이러한 테스트에서 "동일한"연령입니다. -nt와 -ot 모두 동일한 결과를 제공합니다 (거짓). 내 유스 케이스에는 다른 프로그램을 읽는 하나의 프로그램이 있으며 올바른 순서로 실행되었는지 확인해야합니다. 이 경우 나노초를 비교해야합니다.
sjmc

38
if [[ FILE1 -nt FILE2 ]]; then
  echo FILE1 is newer than FILE2
fi

' 남자 테스트 ' 에서 가져 왔습니다 . 발췌 :

FILE1 -nt FILE2
  FILE1 is newer (modification date) than FILE2

7

이를 수행하는 다른 방법 :

find -name file2 -newer file1

file2가 file1보다 오래되었거나 같은 경우 null을 반환합니다. 최신 인 경우 file2의 이름과 디렉토리를 반환합니다.

Linux는 파일이 생성 된시기를 추적하지 않습니다. 이 테스트는 가장 최근의 수정 날짜 및 시간에 대한 것입니다.


2
리눅스는 생성 시간을 기록합니다 : ctime이라고합니다. 또한 마지막 액세스 시간을 추적합니다 : atime. 마지막 수정 시간이므로 일반적으로 mtime을 사용하므로 가장 유용합니다.
Coroos

2
@Coroos : ctime제작 시간이 아닙니다. inode 변경 시간이며 소유자 또는 권한과 같은 파일 속성이 변경되거나 파일을 수정할 때 업데이트됩니다. 일부 파일 시스템은 출생 시간을 지원하지만 커널은 지원하지 않습니다. 통계는 빈 출생 시간을 보여줍니다. 참조 unix.stackexchange.com/a/91200 OS X 출생 시간을 지원하는 주stat -f %SB filename
데니스 윌리엄슨

debugfsLinux에서 생성 (출생) 시간을 보는 방법에 대해서는 htrp : //unix.stackexchange.com/a/50184도 참조하십시오 .
Dennis Williamson

2

더 자세한 정보를 원하면 stat명령을 사용할 수 있습니다

<tbielawa>@(fridge)[~/SuperUser] 03:15:10
$ touch firstFile
<tbielawa>@(fridge)[~/SuperUser] 03:15:24
$ touch secondFile
<tbielawa>@(fridge)[~/SuperUser] 03:15:45
$ stat firstFile 
  File: `firstFile'
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: 805h/2053d  Inode: 151528      Links: 1
Access: (0644/-rw-r--r--)  Uid: (  500/tbielawa)   Gid: (  500/tbielawa)
Access: 2010-09-14 03:15:24.938721003 -0400
Modify: 2010-09-14 03:15:24.938721003 -0400
Change: 2010-09-14 03:15:24.938721003 -0400
<tbielawa>@(fridge)[~/SuperUser] 03:15:48
$ stat secondFile 
  File: `secondFile'
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: 805h/2053d  Inode: 151529      Links: 1
Access: (0644/-rw-r--r--)  Uid: (  500/tbielawa)   Gid: (  500/tbielawa)
Access: 2010-09-14 03:15:45.074722792 -0400
Modify: 2010-09-14 03:15:45.074722792 -0400
Change: 2010-09-14 03:15:45.074722792 -0400

2
echo $(($(date -r file1 +%s)-$(date -r file2 +%s)))
2208

결과가 0보다 크면 첫 번째 파일이 더 새 파일입니다. (리눅스에 저장되는 생성 시간이 아니라 마지막 수정 측면에서 더 낫습니다).


-nt가 일반적으로 더 좋지만, 이것은 여전히 ​​유용한 게시물입니다.
BuvinJ

0

이 링크에 따르면, 유닉스는 생성 날짜를 저장하지 않습니다. http://www.issociate.de/board/post/302628/How_to_check_file_creation_date.html

그러나 마지막 액세스는 저장합니다.

마지막 액세스

 ls -t  # displays in order of date. So the first one is the 

ls는 각 파일을 새 줄에 표시합니다.

따라서 ls -t는 첫 번째 줄 등에 최신 파일을 표시합니다.

  • 자신을 사용하여 첫 번째 줄을 선택할 수 있습니다.
  • sed를 사용하여 첫 번째 줄을 선택할 수 있습니다.

    ls -t php.exe php.ini | sed -n '1p'php.ini

할 수있는 -lt 당신이 파일을 지정하지 않으면 것을 볼 수 있지만 .. 그리고 디렉토리 .. 다음은 첫 번째 줄의 총을 제공 않습니다 당신은 같은 두 번째 행을 선택할 수 있도록$ls -lt | sed -n '2p'

좋은 것은

ls -t | head -n 1

또는

ls -lt | head   

첫 번째 파일을 먼저 수정 한 순서대로 처음 10 행을 표시하며 어떤 파일인지 확인할 수 있습니다.


-t수정 시간입니다. -u액세스 시간
Dennis Williamson

고마워요 날짜별로 주문하는 것보다 낫습니다.
barlop

아마도 날짜 / 시간 순서대로 말하는 것만 큼 좋지는 않지만 ;-)
barlop

0

다음은 약간의 스크립트입니다.

mtf0=`stat -c %Y file0`    
mtf1=`stat -c %Y file1`    
dt=$(( mtf1 - mtf0 ))    
[[ $dt -gt 0 ]] && echo "File F1 is newer than file F0 "

명령에 대한 일부 참조로 이것이 무엇을하는지 자세히 설명해야 잠재적으로 명령을 사용하는 사람들이 명령과 구문을 증명하는 것보다 명령을 읽거나 분석 할 수있는 기회를 갖게됩니다.
Pimp Juice IT
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.