時間でソートされたディレクトリ内の100個の最初のファイルをリストする最良の方法


12

作成されたタイムスタンプ(最も古いもの)でソートされたディレクトリ内の最初の100個のファイルをリストする最良の方法は何でしょうか。ディレクトリは非常に大きくなります(約100000ファイル)。

lsheadにパイプすると、完了するまでに非常に長い時間がかかります。

編集:

  • ファイルシステムはext3です。
  • フォルダ内のファイル数を制限することは努力の価値がありません。これはまれな「クリーンアップ」操作になり、ファイルはサードパーティのソフトウェアによって生成されるためです。
  • 作成時間の代わりにファイル変更時間を使用すると、許容できる解決策が提供されます。


1
クリーンアップ操作find -mtime +<number of days> -deleteの場合は、特定の年齢よりも古いすべてのファイルをクリーンアップするだけでいいかもしれません。つまり、並べ替えは不要です。
ミケル

回答:


14

頭にパイプされたlsを完了するには非常に長い時間がかかります」と言います。

この原因はでなくls、ディレクトリ内のファイルの数です。1つのディレクトリに100,000個のファイルがある場合、この問題を解決するには、すべての100,000個のファイルに関する情報を取得してから、それらのファイルの並べ替えや出力の印刷を検討する必要があります。

時間がかかりすぎる場合、実際の解決策は、ファイルを複数のディレクトリに分割することです。

ファイルを複数のディレクトリに分散できない場合、検討するファイルの数を絞り込む方法はありますか?たとえば、ファイル名に日付が含まれる場合、100,000個のファイルをソートする必要がないようにワイルドカードを含めることができます。それとも、連番が付けられているのでしょうか?(これは役立つかもしれませんが、試してみる価値があります。)

これを何回やろうとしていますか? たぶん、再利用のために出力を保存/キャッシュする価値があります


さて、質問。

あなたは必ず、あなたが「変更時間」「作成時間」を意味していませんか?ほとんどのツールは、「作成時間」ではなく「変更時間」のみを表示できます。

「作成時間」を取得することは非常に新しいことであり、ext4ファイルシステムと、インストールが容易でないいくつかのツールが必要です。


時間を変えたい場合

変更時刻(略してctime)は、ファイルの属性が最後に変更された時刻を意味します。

ls -c ctimeでソートします。

降順ではなく昇順で出力したいので、-rオプションで出力を逆にする必要があります。

したがって、次のようにすることができます。

ls -cr | head -n 100

以下を使用した同じ問題に対するより長い解決策stat

find . -mindepth 1 -maxdepth 1 -exec stat -c $'%Z\t%n' '{}' \; |
    sort -k 1n |
    cut -f 2 -d $'\t' |
    head -n 10 |
    sed -e 's/^\.\///'

しかし、それはls -cr私のシステムよりも遅くなります。


変更時刻が必要な場合

変更時刻(略してmtime)は、ファイルの内容が最後に変更された時刻を意味します。

ls -t mtimeでソートします。

変更ls -crls -tr(最良のオプション)または変更stat -c $'%Z\t%n'しますstat -c $'%Y\t%n'


作成時間が必要な場合

(略してcrtime)

これは難しいです。

最初に、ディレクトリがを使用してフォーマットされたファイルシステムにあることを確認しext4ます。tune2fs -l <device name>これを使用して確認できます。

次に、statと呼ばれる新しい形式%Wがあります。これはここで役立ちます。入手するには、2010年10月以降にリリースされたGNU Coreutilsのバージョンをダウンロードし、抽出、コンパイル、およびインストールする必要があります。

次に、カーネルによっては、これ機能する可能性があります(試していません)。

find . -mindepth 1 -maxdepth 1 -exec stat -c $'%W\t%n' '{}' \; |
    sort -k 1n |
    cut -f 2 -d $'\t' |
    head -n 10 |
    sed -e 's/^\.\///'

こちらもご覧ください:


エラーが発生した場合 "'$\t'

'$\t'表記は必要ですbashzsh:それはでは動作しませんdashshUbuntuで。あなたが本当にこれらのシェルを使用する必要がある場合は、いずれかを変更する必要があります\tCtrl+ VTabおよびリードを削除する$だけでオープニング引用符の前から。


彼がext4を実行していない可能性があります。すべてのマシンでUbuntu 10.04を実行していますが、複数のドライブでJFSを実行しています。AFAIK JFSは作成タイムスタンプをサポートします。
jwernerny

確かに。ext3ではサポートされておらず、ext4ではサポートされていることがわかっています。簡単に検索すると、zfsまたはFreeBSD ufsで動作する可能性が示唆されていますが、Ubuntuではこれらはどちらも一般的ではありません!jfsやxfsなどについてはわかりません。情報やリンクを見つけることができれば、もっと聞いていただければ幸いです。
ミケル

その非常に包括的な答えと、より具体的な質問を書く微妙なリマインダーをありがとう;)「Find」はパフォーマンス面で勝者であることが判明し、fs-typeはext3であることが判明しました。

2

今日のことを発見した場合の別の方法は、パフォーマンスの問題に関連する可能性があります。

I=0; ls -cr /dir/ | while read file; do I=`expr $I + 1`; echo "$file"; if [ $I == 100 ]; then break; fi; done

それは理論的にははるかに高速に出力を開始する必要がありますが、ラグの発生源に依存すると思います。ちょうど服用することができls、ファイルをソートするために、長い時間を。


疑わしい。 head実際に十分な入力を読み取るとすぐに終了します。両方ともtime前面で実行してみてください。headとにかく私のバージョンではバージョンがずっと速い。
ミケル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.