Bash 递归遍历每个子目录并在每个级别上创建一个新目录的脚本

Bash script to recursively traverse every subdirectory and create a new directory on every level

标题说明了一切。我正在尝试编写一个 bash 脚本来递归遍历每个子目录,将起始目录作为 $1 并在该文件夹内创建一个目录。所以给出起始目录结构

starting_directory

新结构将是

starting_directory

我是 bash 的新手(比如今天下午的新手),所以我需要一些帮助。

find  -type d -a -not -name new_dir -print0 | xargs -0 -i@ mkdir -p @/new_dir

find 递归地降低文件或目录层次结构。 -type d表示只看目录。 -a -not -name new_dir 表示排除已命名为 new_dir 的目录(避免可能的无限循环)(“而不是名称”)。 -print0 表示用终止空值打印出来(这可以正确处理其中包含空格的目录)。将此 (|) 通过管道传递给程序 xargs,该程序将标准输入中的每一行传递给给定的命令。 -0 与 find 的 -print0 匹配,以 nul 分隔文件名。 -i@ 表示将命令中的 @ 替换为接收到的文件名。 mkdir 当然是制作目录; -p 通过在不存在的情况下强制创建中间目录来避免任何潜在的排序问题,并且在目录已经存在的情况下避免抱怨。 @/new_dir 使用输入创建新目录。

您可以使用递归 globbing 只获取目录树中的子目录并在其中创建新目录:

#!/usr/bin/env bash

# Make sure recursive globs are enabled
shopt -s globstar

# Cd to the target root directory and populate its subdirs
cd ""
for dir in **/; do
    mkdir "$dir/new_dir"
done

# Finally add one in the root of the tree
mkdir new_dir