许多消息来源说{}的每个实例都将替换为通过find找到的文件名,但是当我尝试运行以下内容时,我只获得一个文本文件,其名称为“.txt”
find /directory -name "*pattern*" -exec cut -f8 {} > {}.txt \;
目标是创建一个文本文件,其中只找到每个文件的第八列,每个文本文件将以其父文件命名。关于第二组{}的东西不会替换为每个找到的文件的文件名。
答案 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}'