我正在关注这个问题尽管这里的某些文件名在文件名开头包含破折号。这被解释为 的附加选项cp
。
下列的另一个问题(关于ServerFault),我尝试将命令更改为:
shuf -zn8 -e *.jpg | xargs -0 cp -vt -- {} target/
或者
shuf -zn8 -e *.jpg -exec cp -vt -- {} target/
无济于事。如何处理-
文件名的开头部分?
答案1
看起来它并不是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
将返回带前缀的文件名./
。
答案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
将会失败争论太多错误)。