【问题标题】:SSH recursively change all subfolders names to a specific nameSSH递归地将所有子文件夹名称更改为特定名称
【发布时间】:2015-10-20 02:27:18
【问题描述】:

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

我试过了

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

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

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

【问题讨论】:

  • 请将您的问题移至Super User。这里是off-topic
  • 我不知道如何移动,我搜索但找不到信息。
  • 这里删除,那里重新发布。

标签: ssh find exec superuser


【解决方案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 为您提供所有“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, $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 以删除每行的计数。将输出通过管道传输到sedp 选项打印输入行,sed 命令的其余部分查找 last 出现的“thumbs”并将其仅更改为“thumb”。由于我们按照从最深到最浅的顺序处理排序列表,这将为mv 提供正确的命令。最后,通过管道连接到xargs-n2 选项告诉xargs 使用管道中的两个 参数并将它们传递给mv 命令。

【讨论】:

    猜你喜欢
    • 2019-05-28
    • 1970-01-01
    • 1970-01-01
    • 2016-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-01
    相关资源
    最近更新 更多