ほぼ250,000個のファイルがあるディレクトリがあり、多くのファイルがあり、x個のランダムファイルを別のディレクトリに移動したいと思います。
shuf
とmv
コマンドを使用してソリューションを検索して取得しました。ここそしてここ、デフォルトでは私はこのコマンドを使用しています
$ shuf -n 5533 -e trainB/* | xargs -i mv {} testB/
ただし、次のエラーが発生します。
bash: /usr/bin/shuf: Argument list too long
ファイル数が多いため、パラメータリストが長すぎるようですが、他の方法はありますか?
SLES12 SP2 で実行中です。
答え1
SLESを使用しているので、GNU拡張を使用してより安全にすることができます。
find trainB -mindepth 1 -maxdepth 1 ! -name '.*' -print0 |
shuf -n 5533 -z |
xargs -r0 mv -t testB
find
ファイルのリストを処理するために使用されます。渡すコマンドライン引数の代わりにパイプを使用し、それを混在させ、出力を制限し、最後にtestB
。に移動し、newlineの代わりにnulターミネータを使用するオプションもあります-print0
。-z
-0
代わりに、次のものを使用できますfind
。
printf '%s\0' trainB/*
printf
内蔵されているのでbash
これに影響されません。引数のリストが長すぎます。システムコールの制限execve()
。ただし、シェルはfind
ソートされていないファイルパスを表示しながらリスト全体を作成してソートする必要があるため、効率が悪くなる可能性があります。