移动或重命名子文件夹

移动或重命名子文件夹

我有一个像这样的文件夹结构:

/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

相关内容