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 found
shopt -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 ''
。