2015-09-17 32 views
1

我有一个彼此兄弟姐妹的文件夹的长列表,它们都以“0”开头,数字命名为(001,002,003 ...)但名称不仅是数字,而且也不相关(例如,我有0010_foo,0032_bar,0150_baz等)。 我需要在列表中的每个文件夹内创建一个新文件夹(js)。我想用递归的方式使用命令行。使用bash在其他文件夹中创建一个文件夹

我已经试过:

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

但我得到一个错误的每次尝试: “MKDIR:JS:文件是否存在”。不需要说我的文件夹中没有名为js的目录,但它们是扩展名为.js的文件。

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

+1

将这项工作吗? '因为我在0 * /;做mkdir“$ i”js; done'。 –

+1

@gniourf_gniourf我已经测试过它很快,似乎工作正常。我喜欢这个解决方案,你可能想要将它作为回答 – ithil

回答

1

我不是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部分创建该目录并消除有关父母不存在的任何错误。查找将其找到的实际目录替换为{}零件。

+0

我试过在测试文件夹中,似乎工作正常。你能解释一下这个命令在做什么?简短的解释,所以答案更完整 – ithil

+2

请注意,这可能不适用于所有版本的'find':'-maxdepth'和'-path'不由POSIX指定,并且POSIX明确指出_If utility_name或argument字符串包含两个字符“{}”,但不只是两个字符“{}”,它是实现定义的,find是替换这两个字符还是不改变地使用字符串。尽管GNU'find'没有问题, 。 –

+0

@chepner我有POSIX似曾相识。 – bishop

2

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

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

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

与'mkdir {}/js'一起运行进入一个循环,其中创建了多个嵌套的“js”文件夹...你能否详细说明你的答案,所以我可以看问题在哪里? – ithil

+0

哦,'find'正在每次传递中找到新的目录。我认为这是一个简单的修复。 – chepner

+0

我想你可以避免'! -path js'谓词(因此不依赖于'-path',它不是真正可移植的),而是使用'-depth'代替:'find -depth -name'0 *'-type d -exec mkdir {}/js \ ;'(注意'{}/js'可能不适用于所有版本的'find')。 –

2

(为什么你的find命令不起作用已在主教的(现已删除)答案中解释 - 我只给出了替代find)。

您可以通过一个shell for环路所以更换find

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

还有你对@ find现象可能存在的问题的解释,也许你可以在这里添加它 – ithil

相关问题