搜索+替换文件名中的字符串

Cam*_*Cam 24 bash

使用bash,如何在目录中递归包含的所有文件名(包括文件夹)中搜索所有出现的子字符串'foo',并用'bar'替换它们?

例如,如果当前结构如下所示:

-foo_test
    - fooo.txt
    - xfoo
        - yfoo.h
- 1foo.c
Run Code Online (Sandbox Code Playgroud)

运行bash脚本后它应该如下所示:

-bar_test
    - baro.txt
    - xbar
        - ybar.h
- 1bar.c
Run Code Online (Sandbox Code Playgroud)

Adr*_*onk 48

这里显示的两种变体都在OPs测试结构上正确使用:

find . -depth -name '*foo*' -execdir bash -c 'mv -i "$1" "${1//foo/bar}"' bash {} \;
Run Code Online (Sandbox Code Playgroud)

或者,如果您有非常多的文件并希望它运行得更快:

find . -depth -name '*foo*' -execdir bash -c 'for f; do mv -i "$f" "${f//foo/bar}"; done' bash {} +
Run Code Online (Sandbox Code Playgroud)

编辑:如评论中所述,我之前的回答使用了一个find没有使用该execdir选项和使用的命令,但rename在名称中包含foo的目录中重命名文件时出现问题.正如所建议的,我已经更改了要使用的find命令-execdir,并且我已使用该rename命令删除了变体,因为它是非标准命令.

  • ...假设你有`rename`命令,这是非标准的. (2认同)