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

OOz*_*Pal 9 command-line mkdir

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

F1
--F11
----F111
----F112
--F12
Run Code Online (Sandbox Code Playgroud)

我希望有:

F1
--Photo
--F11
----Photo
----F111
------Photo
----F112
------Photo
--F12
----Photo
Run Code Online (Sandbox Code Playgroud)

Mel*_*ius 24

您可以使用单个find调用来实现它。

find . -name 'Photo' -prune -o -type d -exec mkdir {}/Photo \;
Run Code Online (Sandbox Code Playgroud)

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

  • @Anwar 当前版本将。需求中有灰色地带。:) 你可以通过在 `-prune` 之前指定 `-type d` 和 `-name 'Photo'` 来改变它。 (3认同)
  • @Anwar 乍一看,这没有意义。您不能在同一文件夹中创建与普通文件同名的文件夹。并且`find` 将继续处理其他文件夹(包括该文件夹的子文件夹,如果您要求的话)。 (2认同)

Zan*_*nna 9

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

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

find -type d | while read dir ; do mkdir "$dir"/Photo ; done
Run Code Online (Sandbox Code Playgroud)

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

如果您的目录名称可能包含换行符或其他奇怪的东西,请使用它可以处理任意名称:

find -type d -print0 | while IFS= read -r -d '' dir ; do mkdir "$dir"/Photo ; done
Run Code Online (Sandbox Code Playgroud)

感谢@terdon 对此的帮助:)


L. *_*mes 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)
Run Code Online (Sandbox Code Playgroud)

脚本更新:

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

  • @Arronical `ls` 没有被解析。这只是对用户的反馈......显示正在发生的事情。就像“这是一个照片目录”这句话。它让用户知道为什么不在那里创建目录。 (3认同)

Ser*_*nyy 5

Python withos.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
Run Code Online (Sandbox Code Playgroud)

解释

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

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

将“/Pictures”替换为“/Photo”以满足您的要求