2013-08-06 58 views
0

加入內部文件,我有一堆目錄下面這種結構:合併目錄和使用bash

\directories\ 
|---\directory1\ 
|  |---file1.txt 
|  |---file2.txt 
| 
|---\directory2\ 
|  |---file1.txt 
|  |---file3.txt 
| 
|---\directory3\ 
|  |---file4.txt 
|  |---file2.txt 

我要那麼它最終這樣合併的目錄和文件:

\directories\ 
|---\directory1\ 
|  |---file1.txt 
|  |---file2.txt 
| 
|---\directory2\ 
|  |---file1.txt 
|  |---file3.txt 
| 
|---\directory3\ 
|  |---file4.txt 
|  |---file2.txt 
| 
|---\mergeddata\ 
|  |---file1.txt (from dir1 and dir2) 
|  |---file2.txt (from dir1 and dir4) 
|  |---file3.txt (from dir2) 
|  |---file4.txt (from dir3) 

我對於bash而言,我感到非常可怕並且一直在嘗試很多事情,但是...沒有得到任何好的結果。

期待一些幫助!

回答

3

你沒有說你想如何合併文件,或以什麼順序。我會猜測「串聯,目錄1出現在diretory2之前,目錄2在目錄3之前」?

下面的腳本顯示了一個簡單的方法來做到這一點,不依靠花哨的置換:

cd directories 
mkdir mergeddata 
for I in directory1 directory2 directory3 ; do # replace with your actual directory list 
    for F in "$I"/* ; do 
     B=$(basename "$F") 
     cat "$F" >> "mergeddata/$B" 
    done 
done 

編輯:我加了一些報價,如果你的任何文件名結束了空格或其他不方便的白色空間。

+0

爲什麼使用'cat'代替'cp'來複制文件內容? –

+1

@GearoidMurphy:因爲原始問題需要合併具有相似名稱的文件。注意我也使用'>>'append操作符來追加到目標文件,而不是覆蓋它。 –

+0

+1有用的貓!你可以使用'for I in * /; do'迭代「目錄」的子目錄 –