web-dev-qa-db-ja.com

ディレクトリ全体で「ls」を実行せずに、最近変更されたファイルを「ls」スタイルの出力にリストしますか?

数万のファイルを含むディレクトリがあります。最近変更されたファイル(たとえば、最終日に変更されたファイルなど)を一覧表示します。

次のコマンドは機能しますが、フォルダー内のすべてのファイルをlsする必要があるため、低速です。

ls -rt | tail -n 10

次のコマンドはより高速ですが、出力はlsほど詳細ではありません。

find -mtime -1

lsに似た出力を使用して、最近変更されたファイル(セット番号または日付順)を一覧表示できる方法はありますか?

3
WackGet

少なくともGNUおよびFreeBSD findsには_-ls_アクションがあり、lsと同様の出力を生成します:

_$ find . -ls
   392815      4 drwxr-xr-x   2 user  group      4096 Jul 22 18:39 .
   392816      0 -rw-r--r--   1 user  group         0 Jul 22 18:39 ./foo.txt
   392818      0 -rw-r--r--   1 user  group         0 Jul 22 18:39 ./bar.txt
_

GNU findはまた、_-printf_アクションの形式で非常に構成可能な出力を備えています。

とはいえ、あなたのlsが非常に遅くなる原因は何でしょうか。 findlsはどちらも、ディレクトリ全体を読み取り、日付を見つけるためにすべてのファイルでlstat()を呼び出す必要があるため、大きな違いはありません。 lsは、ファイルのリスト全体を並べ替える必要があるため、本当に多数のファイルがある場合に違いが生じる可能性があります。その場合は、日付に基づいてファイルを別のディレクトリに分散することを検討してください。 _-r_を削除し、headの代わりにtailを使用すると役立つ場合があります。

5
ilkkachu

Zshシェルを使用できる場合、日付のフィルタリングと並べ替えの一部を実行できます。

最新の2つのファイルをリストします。

ls -ld -- *(om[1,2])

(隠しファイルも考慮するためにD glob修飾子を追加します)。

最も古い2つのファイルをリストします(生成されたリストの最後から逆方向に数えます):

ls -ld -- *(om[-2,-1])

または:

ls -ld -- *(Om[1,2])

5日以上前に変更されたファイルを一覧表示します。

ls -ld -- *(m+4)

find -mtime +4のように、年齢を日数に切り捨てた場合は厳密に4より大きい)。

過去5日以内に変更されたファイルを一覧表示します。

ls -ld -- *(m-5)

これらはすべて "Glob Qualifiers" の例です。ここではzsh Shellがすべてのハードワークを実行しています。一致するファイル名(存在する場合)が表示され、そのリストをlsに渡してリストします。

結果をプレーンファイルのみに制限する場合(ディレクトリ、ソケット、パイプなどではない)、.を使用することに注意してください。例えば:

過去5日以内に変更されたplainファイルを一覧表示します。

ls -ld -- *(.m-5)
3
Jeff Schaller