2

我有数百个文件夹,每个文件夹下都有一个名为“thumbs”的子文件夹。我需要在每个子文件夹下用“thumb”更改“thumbs”子文件夹名称。

我试过了

find . -type d -exec rename 's/^thumbs$/thumb/' {} ";"

当我在包含所有子文件夹的文件夹中时,我在 shell 中运行它,并且这些子文件夹中的每一个都包含需要用“thumb”重命名的“thumbs”文件夹。

好吧,我运行了那个命令,shell 花了很多时间思考,然后我给了一个 CTRL+C 停止,但我检查并没有在当前目录下重命名文件夹,我不知道我是否重命名了我所在目录之外的文件夹,有人可以告诉我代码哪里错了吗?

4

1 回答 1

1

目标 1: 如果只有一级深度,则将子文件夹“thumbs”更改为“thumb”。

示例输入:

./foo1/thumbs
./foo2/thumbs
./foo2/thumbs

解决方案:

find . -maxdepth 2 -type d | sed 'p;s/thumbs/thumb/' | xargs -n2 mv

输出:

./foo1/thumb
./foo2/thumb
./foo2/thumb

解释:

find用来给你所有的“拇指”文件夹只有一层。管道输出到sed. 该p选项打印输入行,sed命令的其余部分将“thumbs”更改为“thumb”。最后,管道到xargs. 该-n2选项告诉xargs使用管道中的两个参数并将它们传递给mv命令。

问题:

这不会捕获更深的子文件夹。您不能简单地在这里不使用 depth ,因为find从顶部打印输出,并且由于我们用sedbefore we替换内容mvmv因此会导致更深的子文件夹出错。例如,./foo/thumbs/thumbs/ 将不起作用,因为mv会先处理 ./foo/thumbs 并使其成为 ./foo/thumb,但接下来的输出行将导致错误,因为 ./foo/拇指/拇指/不再存在。

目标 2:所有子文件夹“拇指”更改为“拇指”,无论多深。

示例输入:

./foo1/thumbs
./foo2/thumbs
./foo2/thumbs/thumbs
./foo2/thumbs

解决方案:

find . -type d | awk -F'/' '{print NF, $0}' | sort -k 1 -n -r | awk '{print $2}' | sed 'p;s/\(.*\)thumbs/\1thumb/' | xargs -n2 mv

输出:

./foo1/thumb
./foo2/thumb
./foo2/thumb/thumb
./foo2/thumb

解释:

用于find为您提供所有“拇指”子文件夹。通过管道输出到awk以打印每个路径中“/”的数量加上原始输出。 sort以数字方式输出,以“/”的数量反向(将最深的路径放在顶部)。将排序列表传递awk给以删除每行的计数。管道输出到sed. 该p选项打印输入行,sed命令的其余部分查找最后一次出现的“thumbs”并将其仅更改为“thumb”。由于我们正在按照从最深到最浅的顺序处理排序列表,因此这将提供mv正确的命令。最后,管道到xargs. 该-n2选项告诉xargs使用两个来自管道的参数并将它们传递给mv命令。

于 2015-10-20T18:28:55.517 回答