使用 `-exec` 和 `xargs` 时处理以破折号(“-”)开头的文件名

使用 `-exec` 和 `xargs` 时处理以破折号(“-”)开头的文件名

我正在关注这个问题尽管这里的某些文件名在文件名开头包含破折号。这被解释为 的附加选项cp

下列的另一个问题(关于ServerFault),我尝试将命令更改为:

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

或者

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

无济于事。如何处理-文件名的开头部分?

答案1

看起来它并不是shufcp处理以破折号开头的文件名。尝试将双破折号添加到shuf命令中:

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

我会用find这个,而不是shuf

find . -type f -name '*.jpg' -print0 | xargs -0I{} cp "{}" target/

cp此外,在这种情况下,您不需要双破折号,因为find将返回带前缀的文件名./

答案2

-t选项(GNU 扩展)采用一个参数,该参数是目标目录。

使用xargs -0 cp -vt -- target/,它将尝试将target/选定的文件复制到名为 的目录中--,并且您仍然没有标记选项的结尾。您shuf还需要标记选项的结尾。

{}find仅与的-exec谓词或与xargs使用时特殊-I'{}',但这里不需要它。shuf没有-exec谓词。

在这里,您想要:

shuf -zen8 -- *.jpg | xargs -r0 cp -vt target --

或者

shuf -zen8 ./*.jpg | xargs -r0 cp -vt target

通过zsh,您还可以使用其e基于 xpression 的o排序 glob 限定符:

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

shuf与在任何系统上工作的方法相比,这具有优势(前提zsh是已安装;您可能需要放弃某些系统上的非标准-v),并且即使jpg当前目录中有两个文件(并且执行shuf将会失败争论太多错误)。

相关内容