递归重命名bash中的目录

  • 本文关键字:重命名 bash 递归 bash
  • 更新时间 :
  • 英文 :


我想通过用 bar 替换字符串的部分来递归地重命名包含字符串 foo 的所有目录。到目前为止,我有类似的东西,但这还不够。我也希望 foo 可以搜索 case-nistimentimentimentimentimentimentimentimentimentimentimentimentimentimentimentiment

find . -type d -exec bash -c 'mv "$1" "${1//foo/Bar}"' -- {} ;

是否有任何优雅的单线可能比这种尝试更好?我实际上尝试了一些,但认为我会延迟给专家。注意:我正在Mac OS X系统上进行此操作,并且没有 Rename 已安装的工具。

使用参数扩展尝试以下代码

find . -type d -iname '*foo*' -depth -exec bash -c '
    echo mv "$1" "${1//[Ff][Oo][Oo]/BAr}"
' -- {} ;

,但最好的选择是prename命令(有时命名为renamefile-rename

find . -type d -iname '*foo*' -depth -exec rename 's@Foo@Bar@gi' {} +

,如果您使用的是bash4zsh** Mean 递归):

shopt -s globstar
rename -n 's@Foo@Bar@gi' **/*foo*/

如果它适合您的需求,请删除-n(干运行)开关以重命名为Real。

一些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
find . -type d -iname '*foo*' -exec bash -O nocasematch -c 
    '[[ $1 =~ (foo) ]] && mv "$1" "${1//${BASH_REMATCH[1]}/Bar}"' -- {} ;

pro:避免使用。
con:如果有多个情况下有多个匹配。
con:很荒谬。

感谢@Gilles Quenot和Wenli:以下对我有用。我基于您的两个解决方案。

find . -depth -type d -name 'ReplaceMe*'  -execdir bash -c 'mv "$1" "${1/ReplaceMe/ReplaceWith}"' -- {} ;

-execdir似乎是Linux Red Hat 7.6

的关键

我一直在搜索类似的答案,并且有效:

find . -depth -name 'foo' -execdir bash -c 'mv "$0" ${0//foo/Bar}"' {} ;

相关内容

  • 没有找到相关文章