2011-06-23 338 views
0

我試圖爲一個目錄列表內遞歸地創建目錄創建一個簡單的shell腳本。shell腳本創建目錄

我的下一個文件結構: 稱爲v_79的目錄,包含「顯示目錄」(從dir_0到dir_210)的列表,並且裏面每個人有幾個目錄稱爲ENSG00000 ??????,其中'?'代表[0-9]之間的字符。

我想創建ENSG00000每一個內一個名爲「MY_DIR」目錄?????迪爾斯。

我知道如何創建一個目錄一旦被內部各dir_XX的,

for i in ENSG00000??????; do mkdir $i/my_dir; done 

,但我不知道如何創建我需要的目錄,在目錄v_79。

+1

這只是需要一個外部循環遍歷dir_0到dir_210結構 – Lazarus

+2

這是一個令人難以置信的大量的目錄創建 - 422萬?? dir_0到dir_210 = 211 x ENSG00000000000到ENSG00000999999 = 1,000,000 +另一百萬用於my_dir的每個目錄,因此每個目錄200萬= 4.22億。除非你解釋了一些錯誤,否則你很難將其應用於任何文件系統。或者是ENSG00000 ??????已經存在? – Orbling

+2

「我知道如何在裏面創建一個目錄......」 - 不,我不認爲你會這樣做:-)這隻會嘗試創建已經存在的目錄。 – paxdiablo

回答

2

如果當前目錄中包含目錄「v_79」,然後

for dir in v_79/dir_{0..210}/ENSG00000??????; do mkdir $dir/my_dir; done 

不知這可能給你一個「參數列表太長」的錯誤,在這種情況下find是要走的路。

+0

其完美的格倫。這完成了這項工作。 Thx太多了! – peixe

2
mkdir -p v_79/dir{0,1}{1,2,3} 

將創建目錄V79/dir01,V79/dir02,V79/dir03,V79/dir11,V79/dir12即使v_79不存在V79/dir13。

的-p選項會遞歸創建所有必需的目錄。

+0

這不會在'ENSG00000 ??????'目錄內創建'my_dir'目錄。 – mouviciel

+0

目錄dir_xx已經存在;我不需要創建它們,正如@mouviciel所說,它不會在裏面創建my_dir目錄。無論如何,Thx! – peixe

3

如果當前目錄是v_79,你可以使用的findxargs組合:

find . -name 'ENSG00000......' -type d | xargs -I DIR mkdir DIR/my_dir 
1

您可以從您v_79目錄這樣做:

for i in `find . -type d -name "ENSG00000??????"`; do mkdir $i/my_dir; done 
+0

這將在當前目錄中的名爲'find','-type','d','-name'和'ENSG00000 ??????'的目錄內創建名爲'my_dir'的目錄,但只有當這些目錄已經存在。你的意思是說'因爲我在$(find。-type d -name「ENSG00000 ??????」);做mkdir -i $ i/my_dir; done',但如果父項已經存在,這也只會創建子目錄。 – Sorpigal

+0

ough ..你是對的。我忘了添加「'」。 – KSDaemon

0

只需添加-p選項,那麼你的工作就會完成。

BTW:對於命令mkdir -p選項的意思是「如果現有的沒有錯誤,使父目錄按需」

0

你想

mkdir v_79/dir_{0,1,2}{,0,1,2,3,4,5,6,7,8,9}{,0,1,2,3,4,5,6,7,8,9}/ENSG00000??????/my_dir 
1

這是dry run - 如果滿意,之前的mkdir

echo ./v_79/**/ENSG* | xargs -I% echo mkdir %/my_dir #or 
echo ./v_79/**/dir_*/ENSG* | xargs -I% echo mkdir %/my_dir 

你需要爲這個bash4和 「禁用了javascript -s globstar」(例如,在您的個人資料刪除回聲)

如果你有太多的目錄,你可能會得到「參數列表太長」錯誤(第1回波)。在這種情況下,與find的解決方案是更好的

find v_79 -type d -print | grep '/ENSG' | xargs -I% echo mkdir %/my_dir 
  • 找到所有的目錄中v_79
  • 過濾出這些有名字ENSG(你可以添加更多的「過濾器」)
  • 運行(回聲)MKDIR用於結果

是某處路徑可以是空間,修改以上:

find v_79 -type d -print0 | grep -z '/ENSG' | xargs -0 -I% echo mkdir %/my_dir 

此外,您還可以再次限制find命令的深度,例如:

find v_79 -depth 2 -type d -print0 | grep -z '/ENSG' | xargs -0 -I% echo mkdir %/my_dir 

,上述所有是空運行 - 去除回聲的運行。 ;)

+0

我已經在第一個答案中使用瞭解決方案。 :) 無論如何,我會投票決定你的解決方案,因爲我是一個新手,它總是有趣的解決方案,代碼解釋爲你確實......;) – peixe