我有父文件夹内的子文件夹列表,如下所示:
Parent folder
folder1
foldera
folder2
folderb
folder3
folderc
我只想通过删除子文件夹名称中的最后两个字符来重命名第二级的子文件夹,我该怎么做?我尝试过类似的东西
find . -depth -type d -exec sh -c 'mv "${0}" "${0%??}"' {} \;
但没有成功。
答案1
不需要find
,它可以与 pure 一起使用bash
,考虑到以下目录结构:
./folder3
./folder3/folderc
./folder2
./folder2/folderb
./folder1
./folder1/foldera
命令:
for f in folder*/*/; do mv -v "$f" "${f%???}"; done
后:
./folder3
./folder3/folde
./folder2
./folder2/folde
./folder1
./folder1/folde
这文件名扩展此处仅匹配子文件夹中的文件夹;folder*/*/
,这就是为什么末尾有一个斜杠。该mv
命令删除最后两个字符,在上面的情况下为 3 个字符,因为结尾斜杠也计入变量值。
答案2
诀窍是使用 min深度 和 max深度 参数 这是我使用的命令:
`find folder -mindepth 2 -maxdepth 2 -type d -exec sh -c 'mv "${0}" "${0%?}"' {} \;`
另请注意,我使用 ${0$?} 而不是双 ??你用过的。调试查找此类问题的一种方法是使用 echo 附加您的操作。因此,在上面的示例中,您将在 mv 命令之前放置一个 echo。
$ find .
.
./folder
./folder/folder1
./folder/folder1/foldera
./folder/folder2
./folder/folder2/folderb
./folder/folder3
./folder/folder3/folderc
$ find folder -mindepth 2 -maxdepth 2 -type d -exec sh -c 'mv "${0}" "${0%?}"' {} \;
$ find .
.
./folder
./folder/folder1
./folder/folder1/folder
./folder/folder2
./folder/folder2/folder
./folder/folder3
./folder/folder3/folder
顺便说一句,我可以使用find .
orfind folder
因为我位于文件夹的父目录中。但是,如果您使用find .
exec 命令,则父目录中的每个子目录都将被转换。当您进行移动、删除等操作时,通常最好明确列出目录,以避免出现意外结果。