shell - 在 ("{}"中多次使用当前文件名 "find -exec")?

标签 shell find

许多消息来源说 {} 的每个实例都将替换为通过 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 是替换这两个字符还是不更改地使用字符串是实现定义的。

关于shell - 在 ("{}"中多次使用当前文件名 "find -exec")?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12965400/

相关文章:

Bash 脚本意外运算符

android - 用于将 AT 命令发送到调制解调器的 ADB shell 脚本 - 无法将控制权返回给 shell 并捕获输出

Linux:如何从文件名中提取信息?

string - SAS - 如果长度一定,则替换字符串中的第 n 个单词

linux - 使用 ${1 :1} in bash

linux - 算术语法错误

php - 如何在Windows上运行PHP编写的shell?

linux - 搜索给定目录以外的文件

linux - 查找超过 3 天的目录并压缩其中的所有文件

c++ - 从字符串中提取子字符串 C++