许多消息来源说 {} 的每个实例都将替换为通过 find 找到的文件名,但是当我尝试运行以下命令时,我只得到一个文本文件,其名称为“.txt”
find /directory -name "*pattern*" -exec cut -f8 {} > {}.txt \;
目标是创建一个文本文件,其中只有找到的每个文件的第八列,并且每个文本文件都将以其父文件命名。关于第二组 {} 的某些内容不会替换为每个找到的文件的文件名。
尝试:
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 是否替换这两个字符或使用字符串而不进行更改。
要处理 William Pursell 在他的回答中提到的警告,请使用以下内容:
find /directory -name "*pattern*" -exec sh -c 'cut -f8 "$1" > "$1.txt"' x {} \;
使用时sh -c
,它会从要执行的字符串后面的参数中获取位置参数。多余的x
填写$0
,替换的文件名将变为$1
.
双引号允许它与包含空格和其他特殊字符的文件名正常工作。
find /directory -name "*pattern*" | xargs awk '{z=FILENAME".txt";print $8>z}'