2015-09-17 72 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

相關問題