我有一堆文件夹,我想循环遍历所有这些文件夹,并在每个文件夹中创建另一个名为“照片”的文件夹
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。但是您尚未指定在这些情况下应该做什么,并且迄今为止发布的所有其他答案也都有此限制。