「mv:パラメータリストが多すぎる」問題を解決しますか?

「mv:パラメータリストが多すぎる」問題を解決しますか?

mv並べ替える必要があるファイルが100万以上あるフォルダがありますが、このメッセージが引き続き出力されるため、何もできません。

-bash: /bin/mv: Argument list too long

拡張子なしでファイルを移動するには、次のコマンドを使用します。

mv -- !(*.jpg|*.png|*.bmp) targetdir/

ベストアンサー1

xargs作業のためのツールです。それ、またはfindそして-exec … {} +。これらのツールはコマンドを複数回実行して、一度にできるだけ多くのパラメータを渡します。

どちらの方法も、可変引数リストが最後にあるときに実行する方が簡単ですが、ここではそうではありません。最後の引数がmvターゲットです。 GNUユーティリティ(つまり、組み込まれていないLinuxまたはCygwin)の場合、-tこのオプションはターゲットをmv最初に渡すのに役立ちます。

ファイル名にスペースや\"'スペースが含まれ-ておらず、1で始まらない場合は、ファイル名を入力として指定するだけです(xargsコマンドはbashに組み込まれているため、コマンドラインの長さ制限は適用されechoません)。ワイルドカード構文を有効にします。!: event not foundshopt -s extglob

echo !(*.jpg|*.png|*.bmp) | xargs mv -t targetdir --

-0このオプションを使用すると、デフォルトのxargs引用形式の代わりにnullで区切られた入力を使用できます。

printf '%s\0' !(*.jpg|*.png|*.bmp) | xargs -0 mv -t targetdir --

またはを使用できますfind。サブディレクトリが繰り返されるのを防ぐには、を使用します-type d -prune。リストされたイメージファイルに対して指定された操作がないため、他のファイルのみが移動されます。

find . -name . -o -type d -prune -o \
       -name '*.jpg' -o -name '*.png' -o -name '*.bmp' -o \
       -exec mv -t targetdir/ {} +

(ここにはシェルワイルドカード方法とは異なり、ドットファイルが含まれます。)

GNU ユーティリティがない場合は、中間シェルを使用して引数を正しい順序で取得できます。この方法はすべてのPOSIXシステムで動作します。

find . -name . -o -type d -prune -o \
       -name '*.jpg' -o -name '*.png' -o -name '*.bmp' -o \
       -exec sh -c 'mv "$@" "$0"' targetdir/ {} +

zshではロードできますmv組み込み:

setopt extended_glob
zmodload zsh/files
mv -- ^*.(jpg|png|bmp) targetdir/

mvまたは let と他の名前が外部コマンドを参照し続けたい場合:

setopt extended_glob
zmodload -Fm zsh/files b:zf_\*
zf_mv -- ^*.(jpg|png|bmp) targetdir/

またはkshスタイルのglobを使用してください。

setopt ksh_glob
zmodload -Fm zsh/files b:zf_\*
zf_mv -- !(*.jpg|*.png|*.bmp) targetdir/

またはGNUを使用mvしてzargs:

autoload -U zargs
setopt extended_glob
zargs -- ./^*.(jpg|png|bmp) -- mv -t targetdir/ --

¹一部のxargs実装では、ファイル名は現在のロケールの有効なテキストでなければなりません。一部の人は、入力の終わりを示す_ためにファイル名を指定することを検討するかもしれません-E ''

おすすめ記事