40

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

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

目标是创建一个文本文件,其中只有找到的每个文件的第八列,并且每个文本文件都将以其父文件命名。关于第二组 {} 的某些内容不会替换为每个找到的文件的文件名。

4

3 回答 3

40

尝试:

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

请注意标准中的以下内容:

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

如果实用程序名称或参数字符串包含两个字符 "{}" ,而不仅仅是两个字符 "{}" ,则由实现定义 find 是否替换这两个字符或使用字符串而不进行更改。

于 2012-10-18T23:49:36.953 回答
16

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

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

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

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

于 2012-10-19T00:13:22.457 回答
1
find /directory -name "*pattern*" | xargs awk '{z=FILENAME".txt";print $8>z}'
于 2013-08-06T12:51:03.217 回答