最初の2桁が16進数のすべてのファイルを削除しようとしているので、次の式を使用します。
ls | grep -Z '^[0-9a-f][0-9a-f]' | xargs -0 rm
ただし、端末出力エラー:
xargs: argument line too long
再確認するために、以下を実行しました。
ls | grep -Z '^[0-9a-f][0-9a-f]'
削除したいすべてのファイルが出力されます。
このエラーが発生するのはなぜですか?また、このファイルをどのように削除しますか?
また、私のファイル名は次のとおりです。
ffc1abfa3149067e990620dbecfa96d325fbbd
ffcc72282168e33110ecf436e2726a5f901ca6
ffd010299a02ded0a8d41ee1ccc242f2193df2
ffd27295acbe3d35088a5a754f5593eac6a0ae
ffd332a39f7be05d58863fe3bf55d7aba68b69
ffd7ba85b0577b90c0fb1b3922303c486127d4
ffdb37718feaf64c404a6c2a3648f15cdf27b1
ffdbffe5b187c8a73d15da9e5f6cc0fb8d4df3
ffdd8c340650848759c7e59f90f8c112ac33ce
ffde57cb4ba9b69531a3b3f2c6588d2802f71b
ffdeb529353a85b642efa1404aa27e58982da1
ffe0bec99e3e64c61dd45e404c8ccf12d7bea5
ffe58837e9d976499781de17628f2f41e16c9a
ffee6887889924583762e43d5a6b9cd29b6690
fff0b6886aff6cb4073742fbf7bcc1b47d9b45
たぶんファイル名自体が長すぎますかxargs
?
答え1
-Z
grep -l
NULに出力する行の改行文字を変更する代わりに、を使用して各ファイル名の後にNULを出力することです。したがって、xargs -0
NUL区切り文字がないため、渡すパラメータが1つだけで、rm
パラメータの最大サイズ(Linuxの場合は128kB)より大きいため、巨大なレコード(複数行を含む)のみを表示できます。とにかくそうではありません。という名前の履歴ファイルはありません...ffd7ba85b0577b90c0fb1b3922303c486127d4<newline>...fff0b6886aff6cb4073742fbf7bcc1b47d9b45
。
以下を実行してください。
rm [0-9a-f][0-9a-f]*
またはリストが大きすぎる場合:
printf '%s\0' [0-9a-f][0-9a-f]* | xargs -r0 rm
または以下を使用してzsh
:
autoload zargs # best in ~/.zshrc
setopt extendedglob # ditto
zargs [0-9a-f](#c2)* -- rm
または以下を使用してksh93
:
command -x rm {2}([0-9a-f])*
または:
find . ! -name . -prune -name '[0-9a-f][0-9a-f]*' -exec rm {} +
C以外のロケールでは、[a-f]
複数の一致が可能です[abcdef]
。
答え2
選択したコマンドを次に変更することをお勧めします。
find . -name '^[0-9a-f][0-9a-f]' -print0 | xargs -0 rm
または他のオプション
find . -name '^[0-9a-f][0-9a-f]' -exec rm {} \;
答え3
ただ見つけて使用することをお勧めします。同様のことがfind -type f -iname '[0-9a-f][0-9a-f]*' -delete
行われるべきです。もちろん、まず-deleteの代わりに-printを使って確認してください。
答え4
ファイルシステムの種類によっては、ファイル名の制限が発生する場合があります。望むより:
http://en.m.wikipedia.org/wiki/Comparison_of_file_systems
特に「制限事項」セクション
ファイルシステムの種類がわからない場合は、次のコマンドを使用して確認できます。
$ cat /etc/fstab