[英]sh script to replace all file names and folder names on mac
我必须替换目录中的所有文件和文件夹名称,它是 mac 上的子目录。
例如;
如果我在 mac 控制台上运行./rename.sh gmail street
,目录结构应该从
root->gmail->a.gmail
->b.gmail
->email->ww.email.g
->gmail.e
到
root->street->a.street
->b.street
->email->ww.email.g
->street.e
我发现更改所有文件名脚本
for f in *;
do
echo mv "$f" "${f/$1/$2}";
done
但是不知道如何更改目录及其子目录的所有文件名和文件夹名称。 任何建议将不胜感激!
使用find
递归遍历子目录。 这有点麻烦,因为您需要显式调用子shell 才能使替换工作。
find . -name "*$1*" -exec bash -c 'mv "$1" "${1/$2/$3}"' bash {} "$1" "$2" \;
解释:
-name "*$1*"
查找包含 "gmail" 的文件和目录。mv "$1" "${1/$2/$3}"
对每个文件执行。 将变量传递给子shell 的最安全方法是通过位置参数: bash -c "cmd" arg0 arg1 arg2 arg3
。 arg0
在 subshell 中变为$0
, arg1
变为$1
,等等。所以:
bash
在子外壳中是$0
(未使用)。{}
,当前文件名,在子 shell 中是$1
。$1
是脚本(“gmail”)的第一个参数,在子外壳中是$2
。$2
是脚本(“street”)的第二个参数,在子shell 中是$3
。
这可能令人困惑。 要记住的是什么$1
里面'mv "$1" "${1/$2/$3}"'
是不一样的$1
之外。 这是两个不同的值。
\\;
表示-exec
操作的结束。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.