2017-12-18 454 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

相关问题