该find
命令具有-exec*
允许它为每个匹配的文件运行命令的标志。对于你的情况,你会这样做:
find ./main_folder -name classFile.trans \
-execdir $SHELL -c "grep -v '$keyword' {} >newClassFile.trans" \;
(\
并添加了换行符,因此无需滚动即可读取整个命令)
分解各种论点:
-name classFile.trans
搜索所有名为classFile.trans
-execdir
运行所有内容,直到包含匹配文件的目录中;
的字符
$SHELL -c
使用立即执行其各自值的参数运行您的 $SHELL(例如 /bin/bash),-c
而不是创建您可以输入的交互式 shell
"grep -v '$keyword' {} >newClassFile.trans"
由于-execdir
;在文件的相应目录中运行您的 grep 和输出重定向 请注意 find 变成{}
匹配文件的名称
- 这是必要的,因此
>
重定向在子命令中运行,而不是在“当前”shell 中运行 find 命令
\;
对字符进行转义,;
以便将其发送到 find 而不是充当命令终止符
一个测试:
# Set up the folders and test files
$ mkdir -p main_folder/{f1,f2,f3}
$ for i in main_folder/f?; do printf 'a\nb\nc\n' >$i/classFile.trans; done
# Contents of one of the test files
$ cat main_folder/f1/classFile.trans
a
b
c
# Set the keyword to the letter 'b'
$ keyword=b
$ find ./main_folder -name classFile.trans -execdir $SHELL -c "grep -v '$keyword' {} >newClassFile.trans" \;
# newClassFile.trans was created sans 'b'
$ cat main_folder/f1/newClassFile.trans
a
c