我想做类似的事情:
find . -type f | xargs cp dest_dir
但是xargs
将使用dest_dir
作为初始参数,而不是最终参数。我想知道:
xargs
的最终参数?这是一个可能但又繁琐的替代方案:
find . -type f | while read f ; do echo cp $f dest_dir ; done
我不喜欢这样,因为会启动数十个cp
进程。
答案 0 :(得分:20)
-I
选项使用从标准输入读取的名称替换初始参数中replace-str
的出现次数。
例如:
find . -type f | xargs -I file cp file dest_dir
应该解决你的问题。
以下教程中的更多详细信息:
http://www.cyberciti.biz/faq/linux-unix-bsd-xargs-construct-argument-lists-utility/
特别是关于{}
作为参数列表标记
答案 1 :(得分:3)
我试图使用xargs和pdfunite实现略微不同的东西,并启动pdfunite的多个实例并没有为我剪掉它。
我本来是想做的:
$ ls -v *.pdf | xargs pdfunite <files> all-files.pdf
all-files.pdf
是pdfunite的最终参数。但是xargs
与-I
并没有给我我想要的东西:
$ ls -v *.pdf | xargs -I {} pdfunite {} all-files.pdf
这只是给了我一个all-files.pdf
是ls
输出的最后一个文件的结果。这是因为启动了pdfunite的多个实例。
我终于放弃了xargs
,并使用了以下更简单的结构,这足以满足我的目的:
$ pdfunite `ls -v *.pdf` all-files.pdf
希望这有助于将来。
答案 2 :(得分:1)
通常,您不需要使用xargs
(例如find . -type f -exec cp {} dest_dir +
)。但万一你这样做......
只需将以下脚本保存在$PATH
中,然后将其用作:
find . -type f | xargs final-args dest_dir -- cp
脚本:
#!/bin/bash
# Usage: final-args 4 5 6 -- echo 1 2 3
final=()
for arg
do
shift
if [[ "$arg" = "--" ]]
then
break
fi
final+=("$arg")
done
exec "$@" "${final[@]}"
答案 3 :(得分:1)
作为替代解决方案,请在命令支持时使用-t
。 cp
和mv
拥有它。
find -type f -print0 | xargs -0 cp -t dest_dir --
find -type f -exec cp -t dest_dir -- {} +
正如o11c所述,在这种情况下使用xargs
是没有必要的。
另请注意,我在第一个示例中使用了-print0
和-0
。使用'\0'
作为分隔符可以避免使用带有换行符的文件名出现问题。
此处的所有人都不建议至少使用-d '\n'
。 xargs
在未指定时分隔空格(而不仅仅是换行符)。
find -type f | xargs -d '\n' cp -t dest_dir --