SSH递归地将所有子文件夹名称更改为特定名称

SSH recursively change all subfolders names to a specific name

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

我试过了

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

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

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

目标 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 只为您提供所有 "thumbs" 个文件夹 一个 层级。将输出通过管道传输到 sedp 选项打印输入行,sed 命令的其余部分将 "thumbs" 更改为 "thumb"。最后,通过管道传输到 xargs-n2 选项告诉 xargs 使用管道中的 两个 参数并将它们传递给 mv 命令。

问题:

这不会捕获更深的子文件夹。你不能在这里简单地不使用深度,因为 find 从顶部打印输出并且因为我们在 mv 之前用 sed 替换了东西, mv 将导致更深的子文件夹错误。例如,./foo/thumbs/thumbs/ 将不起作用,因为 mv 将首先处理 ./foo/thumbs 并将其变为 ./foo/thumb,但下一个输出行将导致错误,因为 ./foo/thumbs/thumbs/ 不再存在。

目标 2: 所有 子文件夹 "thumbs" 更改为 "thumb",无论多深。

示例输入:

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

解法:

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

输出:

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

解释:

使用find给你所有"thumbs"个子文件夹。将输出通过管道传输到 awk 以打印 '/'s in each path plus the original output. sort the output numerically, in reverse (to put the deepest paths on top) by the number of '/' 的数量。将排序列表通过管道传输到 awk 以从每一行中删除计数。将输出通过管道传输到 sedp 选项打印输入行,sed 命令的其余部分找到 最后一次 出现的 "thumbs" 并将其仅更改为 "thumb".由于我们按照从最深到最浅层的顺序处理排序列表,这将为 mv 提供正确的命令。最后,通过管道传输到 xargs-n2 选项告诉 xargs 使用管道中的 两个 参数并将它们传递给 mv 命令。