问题描述
我想将所有包含单词”special”的文件和目录重命名为”regular”。它应保持区分大小写,以便”Special”不会成为”regular”。
如何在bash中递归执行此操作?
最佳思路
尝试执行此操作(要求bash --version
> = 4):
shopt -s globstar
rename -n 's/special/regular/' **
测试正常时,请卸下-n
开关
还有其他相同名称的工具可能无法执行此操作,因此请小心。
如果运行以下命令(GNU
)
$ file "$(readlink -f "$(type -p rename)")"
结果是
.../rename: Perl script, ASCII text executable
并且不包含:
ELF
那么这似乎是正确的工具=)
如果不是这样,则将其设置为Debian
和诸如Ubuntu
之类的派生类的默认值(通常是这种情况):
$ sudo update-alternatives --set rename /path/to/rename
(将/path/to/rename
替换为perl's rename
命令的路径。
如果没有此命令,请搜索软件包管理器以进行安装或do it manually
最后但并非最不重要的一点是,该工具最初是由Perl的父亲Larry Wall编写的。
次佳思路
使用find
的解决方案:
仅重命名文件:
find /your/target/path/ -type f -exec rename 's/special/regular/' '{}' \;
仅重命名目录:
find /your/target/path/ -type d -execdir rename 's/special/regular/' '{}' \+
重命名文件和目录:
find /your/target/path/ -execdir rename 's/special/regular/' '{}' \+
第三种思路
如果您不介意安装其他工具,则可以使用rnm:
rnm -rs '/special/regular/g' -dp -1 *
它将遍历所有目录/sub-directories(由于-dp -1
),并在名称中将常规替换为special。