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


9

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

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

我希望有:

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

Answers:


8

在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)

脚本已更新:

  • 改变下壳体pphoto为大写。
  • 添加了对非站立者文件名的支持(来自Terdon的建议)。

1
我绝对会避免解析ls,它可能会以异常方式失败。我认为避免这种情况的答案可能更安全。
Arronical

3
ls未解析@Arronical 。只是反馈给用户...显示正在发生的事情。就像“这是照片目录”一词一样。让用户知道为什么不在那里创建目录。
LD詹姆斯

1
我曾经以为可能是这样,因为我看不到有任何处理方法。在那种情况下,我撤回我的评论并倾斜:)
Arronical

find -type d F1, 也许?
奥利维尔·格雷戈雷

请注意,如果有一个名为的文件(而不是目录),则此操作将失败$i/Photo,但是OP没有指定在这种情况下应执行的操作。在$is之一包含换行符的情况下,它也将失败,这种情况是不太可能发生的。
terdon

24

您可以使用一个find电话来实现。

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

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


啊,很好,我是这样尝试的,从您的回答中我可以看出我出了错:)
Zanna 2016年

@赞娜-prune?:)是的,这很违反直觉,但值得学习。
Melebius

如果存在名为“照片”的文件,它将停止创建文件夹“照片”吗?
安华

3
@Anwar当前版本为。需求中有一个灰色区域。:)您可以通过-type d-name 'Photo'before 一起指定来更改此设置-prune
Melebius

2
@Anwar乍一看,没有任何意义。您不能在同一文件夹中创建与常规文件同名的文件夹。并且find将继续使用其他文件夹(如果需要的话,包括该文件夹的子文件夹)。
Melebius

9

您可以将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在此方面的帮助:)


如果op的F1目录为~user/Pictures,则移动到父目录并运行该行将Photo在其空间中的每个目录中放置一个目录,该目录可能是数千个。考虑在命令行中添加,F1以避免容易犯的错误。这样,如果不经意间从错误的位置运行,它将不会创建目录。
LD詹姆斯

嗯,我实际上不确定他们的目录结构。我建议F1改用@LDJames
Zanna

5

Python with os.walk只需几行代码就可以相当轻松地做到这一点

$ mkdir dir_one dir_two
$ mkdir dir_two/dir_three
$ python -c 'import os;[os.mkdir(r + "/Pictures") for r,d,f in os.walk(".")]'                 
$ tree
.
├── dir_one
│   └── Pictures
├── dir_two
│   ├── dir_three
│   │   └── Pictures
│   └── Pictures
└── Pictures

说明

我们正在处理的命令是:python -c'import os; [os.mkdir(r +“ / Pictures”)for os.walk(“。”)]中的r,d,f

在这里,我们简单地调用带-c标志的python解释器来指定我们在单引号内给出的命令。os.walk()函数允许我们递归地遍历所有子目录,对于每个子目录(由表示r),我们通过os.mkdir()函数创建Pictures文件夹。r+"/Pictures"只是一种简单的字符串操作,它将子目录字符串和“ / Pictures”字符串连接在一起以形成一个路径

将“ /图片”替换为“ /照片”以符合您的要求


4

如果您使用的是bash,则只需运行:

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

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

-pmkdir方式:

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

在这里,如果目标目录已经存在,我只是用它来抑制错误消息。如果要查看错误,请删除它。

请注意,这将无法Photo在包含名为Photo 的文件的目标目录中创建子目录。您还没有指定在这种情况下应采取的措施,并且到目前为止发布的所有其他答案也有此限制。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.