繁体   English   中英

sh脚本替换mac上的所有文件名和文件夹名

[英]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在 subshel​​l 中变为$0arg1变为$1 ,等等。所以:

    1. bash在子外壳中是$0 (未使用)。
    2. {} ,当前文件名,在子 shell 中是$1
    3. $1是脚本(“gmail”)的第一个参数,在子外壳中是$2
    4. $2是脚本(“street”)的第二个参数,在子shell 中是$3


    这可能令人困惑。 要记住的是什么$1里面'mv "$1" "${1/$2/$3}"'是不一样的$1之外。 这是两个不同的值。

  • \\; 表示-exec操作的结束。

暂无
暂无

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

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