许多消息来源说,{}的每个实例都将被找到的文件名替换,但是当我尝试运行以下操作时,我只得到一个文本文件,其名称为“.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#* /}
问题是找不到重定向,shell是。您的命令完全相当于:
# Sample of INCORRECT code find /directory -name "*pattern*" -exec cut -f8 {} \; > {}.txt
请注意以下标准:
如果存在仅包含两个字符“{}”的多个参数,则该行为是未指定的。
如果一个utility_name或参数字符串包含两个字符“{}”,而不仅仅是两个字符“{}”,那么它是实现定义的,无论find替换这两个字符,还是使用该字符串而不改变。