私はフォローしています この質問 ここのファイル名のいくつかはファイル名の先頭にダッシュが含まれていますが。これは、cp
の追加オプションとして解釈されます。
別の質問(ServerFault) に続いて、コマンドを次のように変更してみました。
shuf -zn8 -e *.jpg | xargs -0 cp -vt -- {} target/
または
shuf -zn8 -e *.jpg -exec cp -vt -- {} target/
無駄に。ファイル名の先頭にある-
に対処するにはどうすればよいですか?
-t
オプション(a GNU拡張子)は、ターゲットディレクトリである引数を取ります。
xargs -0 cp -vt -- target/
を使用すると、target/
と選択したファイルを--
というディレクトリにコピーしようとしますが、オプションの終わりをマークしていません。 shuf
のオプションの終わりもマークする必要があります。
{}
は、find
の-exec
述語、または-I'{}'
を使用する場合はxargs
でのみ特別ですが、ここでは必要ありません。 shuf
には-exec
述語がありません。
ここでは、次のようにします。
shuf -zen8 -- *.jpg | xargs -r0 cp -vt target --
または
shuf -zen8 ./*.jpg | xargs -r0 cp -vt target
zsh
を使用すると、そのe
xpressionベースのo
rderingglob修飾子を使用することもできます。
cp -v -- *.jpg(oe['REPLY=$RANDOM'][1,8]) target/
これには、どのシステムでも機能するshuf
アプローチよりも優れています(zsh
がインストールされている場合、一部のシステムでは非標準の-v
をあきらめる必要がある場合があります)。また、現在のディレクトリにjpg
ファイルが2つある場合でも機能します(また、shuf
の実行は引数が多すぎますエラーで失敗します)。
ダッシュで始まるファイル名で苦労しているのはshuf
ではなくcp
のようです。 shuf
コマンドに二重ダッシュを追加してみてください。
shuf -zn8 -e -- *.jpg | xargs -0I{} cp -vt -- "{}" target/
これには、find
ではなくshuf
を使用します。
find . -type f -name '*.jpg' -print0 | xargs -0I{} cp "{}" target/
また、この場合、cp
は./
のプレフィックスが付いたファイル名を返すため、find
を二重ダッシュする必要はありません。