2014-03-06 72 views
2

我剛剛切換到linux,我正在嘗試編寫我的第一個bash腳本。我有一個包含大量文件夾的文件夾,所有文件夾都包含文件。喜歡的東西:使用for循環將文件從子目錄移動到父目錄

  • MainFolder

    • Folder1中
      • Sub1的(包含多個文件)
      • 分公司2(包含許多文件)
    • 文件夾2
      • Sub1的(包含許多文件)
      • 分公司2(包含許多文件)

    。 。 。

我想將包含在子文件夾中的所有文件移動到其父文件夾中。我的第一本能是嘗試寫一個for循環。我能夠在與命令的時間做一個文件夾:

mv MainFolder/Folder1/*/* MainFolder/Folder1/ 

,但我希望超過在主目錄下的所有文件夾寫一個bash腳本循環。這是我到目前爲止:

#!/bin/bash 

dir1="/pathto/MainFolder" 

subs= ls $dir1 

for i in $subs; do 
    mv "$dir1/$i/*/*" "$dir1/$i/" 
done 

這顯然不起作用,但我不明白我哪裏出錯了。

我也試過:

mv MainFolder/*/*/* MainFolder/*/ 

漂亮的災難性的後果。一旦我使文件移動正常工作,我還想刪除循環中的舊子文件夾。

+0

你想用'MainFolder/Folder1/Sub1/foo.txt'和'MainFolder/Folder1/Sub2/foo.txt'做什麼?名稱衝突時,銷燬一些文件還行嗎? – twalberg

+0

在我的場景中不會有任何名稱衝突,但我會對如何處理該問題感興趣。 – dayne

+0

這將是你決定 - 有很多方法來處理它,兩個明顯的是1)不移動第二個和後來的衝突文件,2)以某種方式重命名所有的衝突,所以他們不衝突。但這取決於你想完成什麼 – twalberg

回答

4

小變化。改變

subs=ls $dir1 

subs=`ls $dir1` 

通知反引號。反引號實際上執行bash命令並返回結果。如果您在該行後面發出echo $subs,您會發現它正確列出了folder1,folder2

第二小改變是刪除mv命令中的雙引號。將它們更改爲

mv $dir1/$i/*/* $dir1/$i 

雙引號需要文字文件名,而刪除引號需要遞歸目錄模式。

之後,您的初始for循環確實是正確的。它將從sub1sub2移動到folder1等。

相關問題