Ext4とLinux - 1つのディレクトリに多数のファイルがある - タスク

Ext4とLinux - 1つのディレクトリに多数のファイルがある - タスク

ディレクトリに多数のファイルがある問題があります。

ファイルシステムはext4です。

2**32 ファイル制限に達し、このパーティションにファイルを書き込むこともできません。

問題は膨大です。

いくつかのファイルを別のリソースに移動する方法がわかりません。

古典的な「ls」と「mv」は動作しません。ファイルが多すぎます...

Bashからファイルをすばやく出力する方法はありますか?

ディレクトリごとに1つのランダムファイル(約2 ** 32ファイル)。

ファイルをすばやくダウンロードできる場合は、スクリプトを作成できます。

どんなアイデアがありますか?

答え1

以下を実行してみてください。

ls --sort=none --no-group

または、特定の数のファイルを制限します。

ls --sort=none --no-group | head -500

答え2

ls大きなディレクトリでタスクを使用することは、GNUがls読むため、非常に非効率的です。みんなディレクトリの前の項目に戻るどの--sort=noneこれは出力が「きれいに」なりたいので使用されます。 ext4ディレクトリには何百万ものファイルを含めることができるため、これは遅く、RAM集約的です。

find代わりに、ディレクトリからファイル名を読み取った後、ファイル名を印刷するディレクトリのファイル一覧を使用する必要があります。特定のファイル(たとえば、1MB未満のすべての「* .jpg」ファイル)を見つけるには、次のように実行できます。

find /my/directory -type f -name "*.jpg" -size -1M

より(1) マニュアルページを探す使い方の詳細です。

処理するファイルの束を見つけたら、xargs各ファイルに対してコマンドを実行できます。たとえば、一時ファイルを削除するには、次のようにします。

find /my/directory -name "*.tmp" -type f -print0 | xargs -0 rm

または、次のような別のディレクトリに移動します。

find /my/directory -name "*.jpg" -print0 | xargs -0 -I '{}' mv '{}' /my/otherdirectory

またはいくつか。このxargsプログラムは、標準入力から読み取った各ファイルに対して特定のコマンドを実行します。xargs(1) のマニュアルページもっと学ぶ。このコマンドは、ターゲットディレクトリをコマンドの最後に配置する必要があるため、mvもう少し複雑です。一方、通常、すべてのファイルはコマンドが指定された後に追加されます。rmmvxargs

ファイルのリストを出力ファイル(たとえば)に保存し、削除/移動したいファイルのみを含めるように編集し、find ... > /tmp/file_list個別に次にパイプすることができます。file_listxargs

xargs -a /tmp/file_list -I '{}' mv '{}' /my/otherdir

関連情報