【问题标题】:Create a folder inside other folders using bash使用 bash 在其他文件夹中创建一个文件夹
【发布时间】:2015-09-17 13:30:53
【问题描述】:

我有一长串文件夹,它们彼此是同级的,它们都以“0”开头并以数字命名(001、002、003...)数字且不相关(例如,我有 0010_foo、0032_bar、0150_baz 等)。 我需要在列表中的每个文件夹中创建一个新文件夹 (js)。我想使用命令行递归地执行此操作。

我试过了:

$ cd path/to/my/root/folder
$ find 0* -type d -exec mkdir js {} \;

但每次尝试都会出错:“mkdir: js: file exists”。不用说我的文件夹中没有名为 js 的目录,但它们是带有 .js 扩展名的文件。

我的命令中的错误在哪里,我该如何解决?谢谢!

【问题讨论】:

  • 这对你有用吗? for i in 0*/; do mkdir "$i"js; done.
  • @gniourf_gniourf 我已经对其进行了快速测试,似乎工作正常。我喜欢这个解决方案,你可能想把它作为答案发布

标签: bash


【解决方案1】:

(为什么你的find 命令不起作用已经在 bishop 的(现已删除)答案中进行了解释——我只是提供find 的替代方案。

您可以将 find 替换为 shell for 循环,如下所示:

for i in 0*/; do mkdir "$i"js; done

【讨论】:

  • 您对@bishop 当前答案中find 可能存在的问题的解释仍然存在,也许您可​​以在此处添加
【解决方案2】:

mkdir js {} 尝试创建两个目录;你想要mkdir {}/js

为防止find 重复查找您的新目录,请忽略任何名为js 的目录。

find 0* ! -path '*/js' -type d -exec mkdir {}/js \;

【讨论】:

  • mkdir {}/js 运行进入了一个疯狂的循环,其中创建了多个嵌套的“js”文件夹......你能否详细说明你的答案,以便我可以看到问题出在哪里?
  • 哦,find 在每次遍历时都在寻找新目录。我认为这很容易解决。
  • 我猜你可以避免! -path js 谓词(因此不要依赖-path 这不是真正可移植的)并使用-depth 代替:find -depth -name '0*' -type d -exec mkdir {}/js \;(注意{}/js可能不适用于所有版本的find)。
  • 还在疯狂循环……它真的对你有用吗?
  • -path 不便携怎么办?它在 POSIX 规范中。
【解决方案3】:

我不能 100% 确定您编辑后的目录结构,但请试一试:

cd /path/to/my/root/folder
find . -maxdepth 1 ! -path . -type d -exec mkdir -p {}/js \;

似乎工作正常:

$ cd /path/to/my/root/folder
$ tree
.
├── 001
│   └── js
└── 002
$ find . -maxdepth 1 ! -path . -type d -exec mkdir -p {}/js \;
.
├── 001
│   └── js
└── 002
    └── js

find 的作用:在当前目录 (.) 中,它找到子目录 (-type d) -- 除了当前目录本身 (! -path .) 和任何子子目录 ( -maxdepth 1)。在这些找到的目录中,它会创建所需的子目录 (-exec ...)。 mkdir -p 部分创建目录并消除有关父母不存在的任何错误。 find 将 {} 部分替换为它找到的实际目录。

【讨论】:

  • 我已经在测试文件夹中尝试过,似乎工作正常。你能解释一下这个命令在做什么吗?简短的解释,所以答案更完整
  • 请注意,这可能不适用于所有版本的 find-maxdepth-path 不是由 POSIX 指定的,并且 POSIX 明确指出 如果实用程序名称或参数字符串包含两个字符“{}”,而不仅仅是两个字符“{}”,由实现定义 find 是否替换这两个字符或使用字符串而不进行更改。 GNU find 没有问题,不过。
  • @chepner 我有 POSIX 似曾相识的感觉。
猜你喜欢
  • 1970-01-01
  • 2020-07-18
  • 1970-01-01
  • 2019-11-24
  • 2017-01-27
  • 1970-01-01
  • 1970-01-01
  • 2015-01-25
  • 2022-01-11
相关资源
最近更新 更多