我有一个像这样的文件夹结构:
/ms/files/a/
/fb/files/a/
/db/files/a/
应该是这样的:
/ms/files/b/
/fb/files/b/
/db/files/b/
我可以使用以下命令找到需要移动或重命名的文件夹
find . -path "*/files/a" -type d
但如何重命名结果呢?
答案1
单程:
for d in /*/files/a/
do
mv "$d" "${d%a/}b"
done
...它用于*
匹配所有初始“客户端”顶级目录,后跟所需的/files/a/
子目录结构。然后,它使用参数扩展来去掉a/
每个参数的尾部,然后用 a “替换”它以b
进行重命名。
答案2
一个黑客解决方案:
eval $(find . -path "*/files/a" -type d -print | xargs -n1 -exec echo | sed 's/\(.*\/\)\(.*\)$/mv \1\2 \1b;/')
Sed 为 mv 命令创建参数。然后对输出进行评估。
如果我们删除eval $()
,看起来会在路径中的三个测试文件夹上执行:
$ find . -path "*/files/a" -type d -print | xargs -n1 -exec echo | sed 's/\(.*\/\)\(.*\)$/mv \1\2 \1b;/'
mv ./client1/files/a ./client1/files/b;
mv ./client2/files/a ./client2/files/b;
mv ./client3/files/a ./client3/files/b;
答案3
通过下面的方法完成并且效果很好
for i in /ms/files/ /fb/files/ /db/files/; do find $i -type d; done| sed -n '/a$/p'| awk '{print "sudo mv" " " $1 " " substr($1,1,10)"b/"}'|sh