许多消息来源说,{}的每个实例都将替换为通过find找到的文件名,但是当我尝试运行以下内容时,我只获得一个文本文件,其名称为".txt"
find /directory -name "*pattern*" -exec cut -f8 {} > {}.txt \;
Run Code Online (Sandbox Code Playgroud)
目标是创建一个文本文件,其中只找到每个文件的第八列,每个文本文件将以其父文件命名.关于第二组{}的东西不会替换每个找到的文件的文件名.
Wil*_*ell 32
尝试:
find /directory -name "*pattern*" -exec sh -c 'cut -f8 {} > {}.txt' \;
Run Code Online (Sandbox Code Playgroud)
但请注意,某些版本的find需要{}是一个独特的参数,否则不会扩展{}为文件名.你可以解决这个问题:
find /directory -name "*pattern*" -exec sh -c 'cut -f8 $0 > $0.txt' {} \;
Run Code Online (Sandbox Code Playgroud)
(此备用命令会将输出文件放在包含匹配文件的子目录中.如果需要,可以通过重定向到 ${0#*/}
问题是find没有进行重定向,shell是.您的命令完全等同于:
# Sample of INCORRECT code
find /directory -name "*pattern*" -exec cut -f8 {} \; > {}.txt
Run Code Online (Sandbox Code Playgroud)
请注意以下标准:
如果存在多个仅包含两个字符"{}"的参数,则行为未指定.
如果utility_name或参数字符串包含两个字符"{}",但不仅仅包含两个字符"{}",则它是实现定义的,无论find是替换这两个字符还是使用字符串而不进行更改.
Bar*_*mar 12
要处理William Pursell在其答案中提到的警告,请使用以下内容:
find /directory -name "*pattern*" -exec sh -c 'cut -f8 "$1" > "$1.txt"' x {} \;
Run Code Online (Sandbox Code Playgroud)
使用时sh -c,它从要执行的字符串后面的参数获取位置参数.额外的x填充$0和替换文件名将成为$1.
双引号允许它与包含空格和其他特殊字符的文件名一起正常工作.
| 归档时间: |
|
| 查看次数: |
17118 次 |
| 最近记录: |