在所有目录中递归创建文件夹“Photo”

在所有目录中递归创建文件夹“Photo”

我有一堆文件夹,我想循环遍历所有这些文件夹,并在每个文件夹中创建另一个名为“照片”的文件夹

F1
--F11
----F111
----F112
--F12

我希望有:

F1
--Photo
--F11
----Photo
----F111
------Photo
----F112
------Photo
--F12
----Photo

答案1

您只需一次find调用即可实现此目的。

find . -name 'Photo' -prune -o -type d -exec mkdir {}/Photo \;

该部分-name 'Photo' -prune -o告诉不要递归到现有(和新创建的)Photo目录:如果找到的文件(或目录)名为Photo,则停止处理它(-prune)。在其他情况下(-o),继续处理目录(-type d)并执行(-exec)命令。

答案2

您可以将find结果传递给while而不是,for因为这样如果文件名中有空格它就不会中断

首先 cd 到目录F1,然后执行:

find -type d | while read dir ; do mkdir "$dir"/Photo ; done

如果目录存在,mkdir就会拒绝创建它,所以没有问题......

如果您的目录名称可能包含换行符或其他奇怪的内容,请使用以下方法处理任意名称:

find -type d -print0 | while IFS= read -r -d '' dir ; do mkdir "$dir"/Photo ; done

感谢@terdon 的帮助:)

答案3

从 F1 上方的目录中运行此脚本:

该脚本的目的是避免在照片目录下创建多余的照片目录。

此外,它的设计可以防止意外地从错误的位置(例如用户的根目录)运行它,而它不会看到该F1目录并错误地在错误的宫殿中创建数百个照片目录。

此外,我打算制作一个易于遵循的脚本,以便用户可以对其进行自定义。

#!/bin/bash

while IFS= read -r -d '' i;
do
    if [[ ! -d $i/Photo ]]; then
        # Filter to skip folders named Photo
        thisfolder="$(echo $i | sed "s/.*\///")"
        if [[ ! $thisfolder == "Photo" ]]; then
            mkdir "$i/Photo"
        fi
    fi
done < <(find F1 -type d -print0)

脚本更新:

  • p将小写字母改为photo大写字母。
  • 增加了对非标准文件名的支持(根据 Terdon 的建议)。

答案4

如果您使用 bash,您可以简单地运行:

shopt -s globstar
for d in **/; do mkdir -p "$d"/Photo; done

globstar选项**匹配“所有文件和 0 个或多个目录和子目录”。换句话说,它以递归方式匹配所有内容。由于/末尾有 ,**/将匹配所有目录和子目录(无文件)。因此,$d将遍历当前目录及其子目录中的所有目录,并Photos在每个目录中创建目录。

-p的标志意味着mkdir

  -p, --parents
          no error if existing, make parent directories as needed

这里,我只是用它来隐藏目标目录已存在时的错误信息。如果你想看到错误,请将其删除。

Photo请注意,这将无法在包含以下内容的目标目录中创建子目录:文件名为 Photo。但是您尚未指定在这些情况下应该做什么,并且迄今为止发布的所有其他答案也都有此限制。

相关内容