我必须替换目录中的所有文件和文件夹名称以及它在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
但不知道如何更改目录的所有文件名和文件夹名称以及它的子目录。任何建议都会欣赏!
答案 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中变为$0
,arg1
变为$1
等等。所以:
bash
在子shell(未使用)中是$0
。{}
,当前文件名,在子shell中为$1
。$1
,您的脚本的第一个参数(" gmail"),在子shell中是$2
。$2
,脚本的第二个参数(" street")在子shell中是$3
。
这可能令人困惑。您要记住的是$1
内的'mv "$1" "${1/$2/$3}"'
与$1
外的\;
不同。这是两个不同的值。
-exec
表示9, 8, 4, 9, 21, 3, 1, 4, 6, 2, 5, 6, 7, 12, 3, 6, 9, 1, 3 // keep duplicates, delete uniques
操作的结束。