web-dev-qa-db-ja.com

`-exec`と` xargs`を使用する場合、ダッシュ( "-")で始まるファイル名に対処する

私はフォローしています この質問 ここのファイル名のいくつかはファイル名の先頭にダッシュが含まれていますが。これは、cpの追加オプションとして解釈されます。

別の質問(ServerFault) に続いて、コマンドを次のように変更してみました。

shuf -zn8 -e *.jpg | xargs -0 cp -vt -- {} target/ 

または

shuf -zn8 -e *.jpg -exec cp -vt -- {} target/

無駄に。ファイル名の先頭にある-に対処するにはどうすればよいですか?

2
havakok

-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を使用すると、そのexpressionベースのorderingglob修飾子を使用することもできます。

cp -v -- *.jpg(oe['REPLY=$RANDOM'][1,8]) target/

これには、どのシステムでも機能するshufアプローチよりも優れています(zshがインストールされている場合、一部のシステムでは非標準の-vをあきらめる必要がある場合があります)。また、現在のディレクトリにjpgファイルが2つある場合でも機能します(また、shufの実行は引数が多すぎますエラーで失敗します)。

3

ダッシュで始まるファイル名で苦労しているのは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を二重ダッシュする必要はありません。

4