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" 个文件夹 一个 层级。将输出通过管道传输到 sed
。 p
选项打印输入行,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
以从每一行中删除计数。将输出通过管道传输到 sed
。 p
选项打印输入行,sed
命令的其余部分找到 最后一次 出现的 "thumbs" 并将其仅更改为 "thumb".由于我们按照从最深到最浅层的顺序处理排序列表,这将为 mv
提供正确的命令。最后,通过管道传输到 xargs
。 -n2
选项告诉 xargs
使用管道中的 两个 参数并将它们传递给 mv
命令。
我有数百个文件夹,每个文件夹下都有一个名为 "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" 个文件夹 一个 层级。将输出通过管道传输到 sed
。 p
选项打印输入行,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
以从每一行中删除计数。将输出通过管道传输到 sed
。 p
选项打印输入行,sed
命令的其余部分找到 最后一次 出现的 "thumbs" 并将其仅更改为 "thumb".由于我们按照从最深到最浅层的顺序处理排序列表,这将为 mv
提供正确的命令。最后,通过管道传输到 xargs
。 -n2
选项告诉 xargs
使用管道中的 两个 参数并将它们传递给 mv
命令。