繁体   English   中英

在bash中递归重命名目录

[英]recursively rename directories in bash

我想通过用Bar替换字符串的那一部分来递归重命名包含字符串foo的所有目录。 到目前为止,我有类似的东西,但它不太有用。 我也喜欢foo被搜索不区分大小写

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

有没有优雅的单行可能比这次尝试更好? 我实际上尝试了一些,但我认为我会顺从专家。 注意:我在Mac OS X系统上执行此操作,并且没有安装重命名等工具。

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

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**表示递归 ):

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}"' -- {} \;

专业:避免sed。
骗局:如果在不同情况下有多个匹配,则找不到所有匹配。
骗局:很荒谬。

我一直在寻找类似的答案,这个有效:

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

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

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

-execdir似乎是Linux Red Hat 7.6的关键

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM