sh脚本替换mac

时间:2017-10-19 10:19:19

标签: bash macos shell

我必须替换目录中的所有文件和文件夹名称以及它在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 

但不知道如何更改目录的所有文件名和文件夹名称以及它的子目录。任何建议都会欣赏!

1 个答案:

答案 0 :(得分:1)

使用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在子shell中变为$0arg1变为$1等等。所以:

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

    5. 这可能令人困惑。您要记住的是$1内的'mv "$1" "${1/$2/$3}"'$1外的\;不同。这是两个不同的值。

    6. -exec表示9, 8, 4, 9, 21, 3, 1, 4, 6, 2, 5, 6, 7, 12, 3, 6, 9, 1, 3 // keep duplicates, delete uniques 操作的结束。