5

假设我有一些目录,其中包含许多子目录,并且在每个子目录中我想创建一个具有相同名称的目录:

./dir-1
./dir-2
...
./dir-n

我想要做mkdir */new-dir

但这会引发错误。解决这个问题的最佳方法是什么?

4

4 回答 4

8
for dir in $(ls); do
  mkdir "$dir/new-dir"
done
于 2013-06-25T06:49:53.260 回答
3
find . -type d | xargs -I "{x}" mkdir "{x}"/new-dir

如果要将其减少到第一级目录,请使用

find . -maxdepth 1 -type d | xargs -I "{x}" mkdir "{x}"/new-dir
于 2013-06-25T06:56:14.263 回答
2

令人惊讶的是,这个问题从未得到理智的答案:

shopt -s nullglob
for i in */; do
    mkdir -- "${i}newdir"
done
  • 对于文件名中的有趣符号(空格、通配符等),这是 100% 安全的。
  • 如果shopt -s nullglob没有匹配项,则 glob 将扩展为空。
  • 标记选项结束的--in mkdir(如果有一个名称以连字符开头的目录,则不会混淆mkdir尝试将其解释为选项)。

这会默默地忽略隐藏目录。如果您需要对隐藏目录执行此操作,只需将该行替换为shopt -s nullglob以下内容:

shopt -s nullglob dotglob

这样dotglobglob 也考虑隐藏文件/目录。

如果您只想调用一次mkdir

shopt -s nullglob
dirs=( */ )
mkdir -- "${dirs[@]/%/newdir}"
于 2014-04-30T22:02:34.270 回答
0

最好只列出目录,否则在遇到文件而不是目录时可能会出现一堆错误

for dir in $(ls -d */); do mkdir "$dir/2015" done

于 2014-04-30T21:59:21.550 回答