xargs的最终参数

时间:2013-11-28 15:17:45

标签: xargs

我想做类似的事情:

find . -type f | xargs cp dest_dir

但是xargs将使用dest_dir作为初始参数,而不是最终参数。我想知道:

  1. 是否可以指定xargs的最终参数?
  2. 获得相同结果的其他任何替代方案?
  3. 修改

    这是一个可能但又繁琐的替代方案:

    find . -type f | while read f ; do echo cp $f dest_dir ; done
    

    我不喜欢这样,因为会启动数十个cp进程。

4 个答案:

答案 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.pdfls输出的最后一个文件的结果。这是因为启动了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)

作为替代解决方案,请在命令支持时使用-tcpmv拥有它。

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 --