回答:
mv `ls | head -500` ./subfolder1/
-
か.
、またはで始まり、subfolder1
それ自体がそのリストに表示されないと仮定します。)
$ sudo mv `ls | head -50000` 01/ sudo: unable to execute /bin/mv: Argument list too long
でzsh
:
mv -- *(D.oN[1,5000]) ./subfolder1
ディレクトリ内の順序で最大5000個の通常ファイルを移動します。
辞書順にソートされたリストの最初の5000の場合:
mv -- *(D.[1,5000]) ./subfolder1
引数リストに関するエラーが長すぎる場合。以下を発行することにより、zsh
のbuitin mv
コマンドを使用できます。
zmodload zsh/files
最初。
POSIXly:
set --
for f in .* *; do
[ "$#" -lt 5000 ] || break
[ -f "$f" ] || continue
[ -L "$f" ] && continue
set -- "$@" "$f"
done
mv -- "$@" subfolder1/
シンプルで、特殊な文字、スペースなどをサポートするバージョン
ls -Q dir1 | head -1000 | xargs -i mv dir1/{} dir2/
これが機能するためには、そのままでdir2
存在している必要があり、あなたはの親ディレクトリからそれを実行する必要がありますdir1
とdir2
。
これにより、1000個のファイルがdir1からdir2に移動します。
ls -Q -S dir1 | head -1000 | xargs -i mv dir1/{} dir2/
dir1で最大1000個のファイルを移動した場合(-Sはサイズでファイルをリストします)
ls -Q
と互換性のある出力を生成しないことに注意してくださいxargs
。スペース文字を含むファイル名には役立ちますが、二重引用符やバックスラッシュ、およびTABなどの制御文字を含むファイル名の害には役立ちません。
次のようなことが必要になる場合があります。
x=1
for file in *
do
if [ "X$x" = "X#####" ]; then
break
fi
mv $file <destination>
x=`expr $x + 1`
done
このスクリプトは、bash、ksh、shおよび複数のUNIXバリアントで機能します。
destination
自身がそのリストには表示されません。)
以下のコマンドを実行
find . -name 'Hello*.gz' | head -n 5000 | xargs -I {} mv {} /data01/path/
ではfind
コマンド、.
(ドット)は、現在のディレクトリを表し、
Helloで始まりgzで終わるファイルを検索します。最初の5000ファイルがパスに移動されます /data01/path/
私はこのようにMVバッシュエラーなしで50,000の移動を成功させることができました
ls | head -50000 | xargs -I{} sudo mv {} 01/
おもしろいことに、これはsamba共有上にあったので、50kの制限は、WindowsエクスプローラーGUIが一般にディレクトリ内の60kを超えるファイルを好まないためです。