我想通过用Bar替换字符串的那一部分来递归重命名包含字符串foo的所有目录.到目前为止,我有类似的东西,但它不太有用.我也喜欢foo被搜索不区分大小写.
find . -type d -exec bash -c 'mv "$1" "${1//foo/Bar}"' -- {} \;
有没有优雅的单行可能比这次尝试更好?我实际上尝试了一些,但我认为我会顺从专家.注意:我在Mac OS X系统上执行此操作,并且没有安装重命名等工具.
Gil*_*not 12
使用参数扩展尝试以下代码
find . -type d -iname '*foo*' -depth -exec bash -c '
echo mv "$1" "${1//[Ff][Oo][Oo]/BAr}"
' -- {} \;
Run Code Online (Sandbox Code Playgroud)
但你最好的选择是prename命令(有时命名rename或file-rename)
find . -type d -iname '*foo*' -depth -exec rename 's@Foo@Bar@gi' {} +
Run Code Online (Sandbox Code Playgroud)
如果您正在使用bash4或zsh(**意味着递归):
shopt -s globstar
rename -n 's@Foo@Bar@gi' **/*foo*/
Run Code Online (Sandbox Code Playgroud)
如果它符合您的需要,请移除-n(干运行)开关以重命名为真实.
一些DOC
重命名最初是由Perl的父亲Larry Wall自己写的.
我怀疑问题是让它与之合作mkdir -p foo/foo/foo.
在这方面,我认为基于的解决方案find可能不会起作用,因为路径列表可能是预先确定的.
以下是没办法优雅,和绵延的定义一行程序,但适用于上述测试.
$ mkdir -p foo/foo/foo
$ (shopt -s nullglob && _() { for P in "$1"*/; do Q="${P//[Ff][Oo][Oo]/bar}"; mv -- "$P" "$Q"; _ "$Q"; done } && _ ./)
$ find
.
./bar
./bar/bar
./bar/bar/bar
Run Code Online (Sandbox Code Playgroud)
find . -type d -iname '*foo*' -exec bash -O nocasematch -c \
'[[ $1 =~ (foo) ]] && mv "$1" "${1//${BASH_REMATCH[1]}/Bar}"' -- {} \;
Run Code Online (Sandbox Code Playgroud)
专业:避免sed.
骗局:如果在不同情况下有多个匹配,则找不到所有匹配.
骗局:很荒谬.