ディレクトリに多数のファイルがある問題があります。
ファイルシステムは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
もう少し複雑です。一方、通常、すべてのファイルはコマンドが指定された後に追加されます。rm
mv
xargs
ファイルのリストを出力ファイル(たとえば)に保存し、削除/移動したいファイルのみを含めるように編集し、find ... > /tmp/file_list
個別に次にパイプすることができます。file_list
xargs
xargs -a /tmp/file_list -I '{}' mv '{}' /my/otherdir