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、「より古い」です。
デニスウィリアムソン

1
私はこれで問題に遭遇したと思います。修正時間が同じ秒単位のファイルの場合、これらのテストでは「同じ」経過時間です。-ntと-otは両方とも同じ結果を返します(false)。私の使用例では、1つのプログラムが他の出力を読み取っており、それらが正しい順序で実行されていることを確認する必要があります。この場合、ナノ秒を比較する必要があるようです。
sjmc


7

これを行う別の方法:

find -name file2 -newer file1

file2が古いか、file1と同じ年齢の場合、nullを返します。file2が新しい場合は、file2の名前(およびディレクトリ)を返します。

Linuxはファイルがいつ作成されたかを追跡しないことに注意してください。これらのテストは、最新の変更日時に対して行われます。


2
Linuxは作成時間を追跡します。ctimeと呼ばれます。また、最終アクセス時刻atimeを追跡します。これは最後の変更時刻であるため、一般的にmtimeを使用します。これは最も便利です。
コロス

2
@Coroos:ctime作成時間ではありません。これはiノードの変更時間であり、所有者や許可などのファイルの属性が変更されたとき、またはファイルを変更したときに更新されます。一部のファイルシステムは出生時間をサポートしていますが、カーネルはサポートしていません。Statは空の出生時刻を示します。unix.stackexchange.com/a/91200を参照してください。OSXは出生時間をサポートしていることに注意してくださいstat -f %SB filename
デニスウィリアムソン

debugfsLinuxで作成(誕生)時間を確認する方法については、htrp://unix.stackexchange.com/a/50184も参照してください。
デニスウィリアムソン

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の場合、最初のファイルの方が新しいです。(Linuxに保存される作成時間ではなく、最終変更の点で新しい)。


-ntは一般的に優れていますが、これはまだ有用な投稿です
...-BuvinJ

0

このリンクによると、unixは作成日を保存しません。 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アクセス時間
デニスウィリアムソン

ありがとう.. -u ..区別について疑問に思っていました。そして、あなたが提案するようにはい。日付で注文するというよりはましです。
-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 "

コマンドのリファレンスを使用してこれが何をしているのかをより詳細に説明する必要があります。そのため、コマンドを使用する可能性のある人は、コマンドや構文を証明するだけでなく、それについて読んだり、分解したりする機会があります
ピンプジュースIT
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.