2017-12-18 219 views
0

因此,我正在尋找一種方法來將多個子文件夾中的.html文件保存在自己的位置。Bash - 在分開的子文件夾中合併文件

實際情況:

$ Folder1 
. 
├── Subfolder1 
│ └── File1.html 
    └── File2.html 
├── Subfolder2 
│ └── File1.html 
    └── File2.html 

期望的結果:

$ Folder1 
. 
├── Subfolder1 
│ └── Mergedfile1.html 
    └── File1.html 
    └── File2.html 
├── Subfolder2 
│ └── Mergedfile2.html 
    └── File1.html 
    └── File2.html 

到目前爲止,我想出了這個:

find . -type f -name *.html -exec cat {} + > Mergedfile.html 

但這種結合了所有的所有文件Folder1子文件夾,而我想讓他們分開。

非常感謝!

+0

我想你想要的是'-maxdepth 1個型D'到你的'find'命令:) –

回答

0

像由AK_說,你可以用找到的exec。

find Folder1/ -mindepth 1 -maxdepth 1 -type d -exec sh -c "rep='{}';cat "'"$rep"'"/*.html > "'"$rep"'"/Mergedfile.html" \; 
+0

你不能使用'{} 「就這樣!這是危險的,並不適用於所有版本的「find」。危險:如果有一個名爲''的文件會發生什麼? rm -rf /#'? POSIX明確指出[如果utility_name或參數字符串包含兩個字符「{}」,但不是兩個字符「{}」,則它是實現定義的,find是否會替換這兩個字符或不改變地使用該字符串。] (http://pubs.opengroup.org/onlinepubs/9699919799/utilities/find.html)。所以你使用'{}'是危險的,不正確的。 –

+0

這工作完美! Justed運行另一個命令,以便在戰後再添加子文件夾名稱。非常感謝@ctac_! – Hugo

1

您可以循環在具有for聲明所有子文件夾:

for i in Folder1/SubFolder*; do 
    cat "$i"/File*.html > MergeFile$(echo "$i" | sed 's,.*\([0-9]\+\)$,\1,').html 
done 
+0

未加引號的變量將在這有限的情況下工作,但爲了您的代碼在公共角情況下工作,你應該*總是*引用包含帶雙引號的文件名的變量。另請參閱https://stackoverflow.com/questions/10067266/when-to-wrap-quotes-around-a-shell-variable – tripleee

+0

你是對的...我編輯我的帖子 – oliv

相關問題