数万のファイルを含むディレクトリがあります。最近変更されたファイル(たとえば、最終日に変更されたファイルなど)を一覧表示します。
次のコマンドは機能しますが、フォルダー内のすべてのファイルをls
する必要があるため、低速です。
ls -rt | tail -n 10
次のコマンドはより高速ですが、出力はls
ほど詳細ではありません。
find -mtime -1
ls
に似た出力を使用して、最近変更されたファイル(セット番号または日付順)を一覧表示できる方法はありますか?
少なくともGNUおよびFreeBSD find
sには_-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
が非常に遅くなる原因は何でしょうか。 find
とls
はどちらも、ディレクトリ全体を読み取り、日付を見つけるためにすべてのファイルでlstat()
を呼び出す必要があるため、大きな違いはありません。 ls
は、ファイルのリスト全体を並べ替える必要があるため、本当に多数のファイルがある場合に違いが生じる可能性があります。その場合は、日付に基づいてファイルを別のディレクトリに分散することを検討してください。 _-r
_を削除し、head
の代わりにtail
を使用すると役立つ場合があります。
Zshシェルを使用できる場合、日付のフィルタリングと並べ替えの一部を実行できます。
ls -ld -- *(om[1,2])
(隠しファイルも考慮するためにD
glob修飾子を追加します)。
ls -ld -- *(om[-2,-1])
または:
ls -ld -- *(Om[1,2])
ls -ld -- *(m+4)
(find -mtime +4
のように、年齢を日数に切り捨てた場合は厳密に4より大きい)。
ls -ld -- *(m-5)
これらはすべて "Glob Qualifiers" の例です。ここではzsh Shellがすべてのハードワークを実行しています。一致するファイル名(存在する場合)が表示され、そのリストをls
に渡してリストします。
結果をプレーンファイルのみに制限する場合(ディレクトリ、ソケット、パイプなどではない)、.
を使用することに注意してください。例えば:
ls -ld -- *(.m-5)