shufとmvを使用したランダムファイルの移動 - パラメータリストが長すぎます。

shufとmvを使用したランダムファイルの移動 - パラメータリストが長すぎます。

ほぼ250,000個のファイルがあるディレクトリがあり、多くのファイルがあり、x個のランダムファイルを別のディレクトリに移動したいと思います。

shufmvコマンドを使用してソリューションを検索して取得しました。ここそしてここ、デフォルトでは私はこのコマンドを使用しています

$ 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ソートされていないファイルパスを表示しながらリスト全体を作成してソートする必要があるため、効率が悪くなる可能性があります。

関連情報