如何在“find (...) -exec (...) {} \;”中替换 {} 中的字符串 bash 命令?

jul*_*jul 6 bash find

如何替换{}bash 的“查找”找到的字符串?

例如,我想?在下面用“out”替换“in”:

find . -name "*.in" -exec python somescript.py {} ? \;

即对所有“*.in”文件执行

python somescript.py somefile.in somefile.out

Gil*_*il' 11

find没有替换功能。你需要调用一个shell。

find . -name "*.in" -exec sh -c 'python somescript.py "$0" "${0%.in}.out"' {} \;
Run Code Online (Sandbox Code Playgroud)

$0是文件名,${0%.in}删除.in后缀。

或者,在 bash(但不是纯 sh)中,运行shopt -s globstar以启用递归目录扩展(shopt -s nullglob如果存在没有任何匹配.in文件的风险)并使用for循环而不是find.

for x in **/*.in; do
  python somescript.py "$x" "${x%.in}.out"
done
Run Code Online (Sandbox Code Playgroud)


l'L*_*L'l 5

使用Brace Expansion

find . -name "*.in" -exec bash -c 'python script.py "${0%.*}"{.in,.out}' {} \;
Run Code Online (Sandbox Code Playgroud)

使用Shell Parameter Expansion

find . -name "*.in" -exec bash -c 'python script.py "${0} ${0/.in/.out}"' {} \;
Run Code Online (Sandbox Code Playgroud)

结果

python script.py somefile.in somefile.out
Run Code Online (Sandbox Code Playgroud)