在“find -exec”中多次使用当前文件名(“{}”)?

时间:2012-10-18 23:44:12

标签: shell find

许多消息来源说{}的每个实例都将替换为通过find找到的文件名,但是当我尝试运行以下内容时,我只获得一个文本文件,其名称为“.txt”

find /directory -name "*pattern*" -exec cut -f8 {} > {}.txt \;

目标是创建一个文本文件,其中只找到每个文件的第八列,每个文本文件将以其父文件命名。关于第二组{}的东西不会替换为每个找到的文件的文件名。

3 个答案:

答案 0 :(得分:31)

尝试:

find /directory -name "*pattern*" -exec sh -c 'cut -f8 {} > {}.txt' \;

但请注意,某些版本的find需要{}才能成为一个独特的参数,否则不会将{}扩展为文件名。你可以用以下方法解决这个问题:

find /directory -name "*pattern*" -exec sh -c 'cut -f8 $0 > $0.txt' {} \;

(此备用命令会将输出文件放在包含匹配文件的子目录中。如果需要,您可以通过重定向到${0#*/}

来避免这种情况。

问题是find没有进行重定向,shell是。您的命令完全等同于:

# Sample of INCORRECT code
find /directory -name "*pattern*" -exec cut -f8 {} \; > {}.txt

请注意以下标准:

如果存在多个仅包含两个字符“{}”的参数,则行为未指定。

如果一个utility_name或参数字符串包含两个字符“{}”,而不只是两个字符“{}”,则它是实现定义的,无论find是替换这两个字符还是使用该字符串而不进行更改。

答案 1 :(得分:11)

要处理William Pursell在答案中提到的警告,请使用以下内容:

find /directory -name "*pattern*" -exec sh -c 'cut -f8 "$1" > "$1.txt"' x {} \;

使用sh -c时,它会从要执行的字符串后面的参数中获取位置参数。额外的x填写$0,替换的文件名将变为$1

双引号允许它与包含空格和其他特殊字符的文件名一起正常工作。

答案 2 :(得分:1)

find /directory -name "*pattern*" | xargs awk '{z=FILENAME".txt";print $8>z}'