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
) 命令。
您可以将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 对此的帮助:)
从 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)
脚本更新:
p
中photo
为大写。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”以满足您的要求
归档时间: |
|
查看次数: |
1277 次 |
最近记录: |