タイムスタンプ順にファイルを探す

タイムスタンプ順にファイルを探す

dir2つの一般的なファイルがあります。

file1はいabc\nfile2ありますdef\n。以下のようにgzipを使用して2つのファイルを圧縮します。

#ls
#echo 'abc\n' > file1
#echo 'def\n' > file2
#gzip file1
#gzip file2
#ls
file1.gz  file2.gz

内容物を掻き取った後、

#find . -type f  -name "*.gz" -exec zgrep -Iq . \{} \; -exec zcat \{} \;
def\n
abc\n

ファイル生成時間順にファイルの内容を取得できません。予想される出力は常に必要ですabc\ndef\n

興味深い観察:実際の出力はdef\nabc\n時々abc\ndef\n

質問:

タイムスタンプ順(降順/増分)でファイルを検索するには?

ベストアンサー1

報告されたファイルの順序はfindユーザーに不透明です。ディレクトリに表示される順序です。一部のfind実装では、パフォーマンスを向上させるために、inode番号やその他の基準に基づいて順序を変更します。順序を変更する唯一の方法は、-depth述語を介してfind処理/出力が現在ある分岐の前に出るように指示することです。

あるいは、再帰的なglob関数をfind使用することもできます。zsh

zgrep whatever ./**/*.gz(D.Om)

GlobOm修飾子は最後の修正時刻に基づいてソートされます(最も古いものから)。デフォルトでは、隠し(ドット)ファイルを含む通常のファイル('sと同じ).でのみ機能します。find-type fDfind

あなたが得る場合引数のリストが長すぎます。エラーが発生しました。以下を使用できますzargs

autoload -U zargs # best in ~/.zshrc
zargs ./**/*.gz(D.Om) -- zgrep whatever

(またはKshスタイルのプロセス置換をサポートするシェル)と最新のGNUツールを使用するbashと、次のようになります。

xargs -r0a <(
  export LC_ALL=C
  find . -type f -name '*.gz' -printf '%T@\t%p\0' |
    sort -zn | cut -zf2-) zgrep whatever

おすすめ記事