假设我有一些目录,其中包含许多子目录,并且在每个子目录中我想创建一个具有相同名称的目录:
./dir-1
./dir-2
...
./dir-n
我想要做mkdir */new-dir
但这会引发错误。解决这个问题的最佳方法是什么?
for dir in $(ls); do
mkdir "$dir/new-dir"
done
find . -type d | xargs -I "{x}" mkdir "{x}"/new-dir
如果要将其减少到第一级目录,请使用
find . -maxdepth 1 -type d | xargs -I "{x}" mkdir "{x}"/new-dir
令人惊讶的是,这个问题从未得到理智的答案:
shopt -s nullglob
for i in */; do
mkdir -- "${i}newdir"
done
shopt -s nullglob
没有匹配项,则 glob 将扩展为空。--
in mkdir
(如果有一个名称以连字符开头的目录,则不会混淆mkdir
尝试将其解释为选项)。这会默默地忽略隐藏目录。如果您需要对隐藏目录执行此操作,只需将该行替换为shopt -s nullglob
以下内容:
shopt -s nullglob dotglob
这样dotglob
glob 也考虑隐藏文件/目录。
如果您只想调用一次mkdir
:
shopt -s nullglob
dirs=( */ )
mkdir -- "${dirs[@]/%/newdir}"
最好只列出目录,否则在遇到文件而不是目录时可能会出现一堆错误
for dir in $(ls -d */); do
mkdir "$dir/2015"
done