【问题标题】:Merging directories and joining inner files with bash使用 bash 合并目录和连接内部文件
【发布时间】:2013-08-06 13:50:14
【问题描述】:

我有一堆遵循这种结构的目录:

\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 感到很糟糕,并且尝试了很多东西,但是……没有得到任何好的结果。

期待一些帮助!

【问题讨论】:

    标签: linux bash bash4


    【解决方案1】:

    你没有说你希望如何合并文件,或者以什么顺序。我会猜“串联,directory1出现在directory2之前,directory2出现在directory3之前”?

    以下脚本显示了一种直接的方法,无需依赖花哨的替换:

    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
    

    编辑:我添加了一些引号,以防您的任何文件名以空格字符或其他不方便的空格结尾。

    【讨论】:

    • 为什么要使用cat而不是cp来复制文件内容?
    • @GearoidMurphy:因为最初的问题要求合并具有相似名称的文件。请注意,我还使用了>> append 运算符来追加到目标文件,而不是覆盖它。
    • +1 有用的猫!您可以使用for I in */; do 来遍历“目录”的子目录
    • @glennjackman:如果目标目录不在当前目录中,则执行for I in */ 将起作用。但在本例中,mergeddata 与directory1、directory2 和directory3 位于同一目录中。一旦I 变为mergeddata,for 循环就会做出令人惊讶的事情。
    • 在这种情况下,因为我们被标记为bash,shopt -s extglob; for I in !(mergedata)/
    猜你喜欢
    • 2015-03-13
    • 2011-06-23
    • 1970-01-01
    • 2011-10-20
    • 2021-03-11
    • 1970-01-01
    • 1970-01-01
    • 2020-05-31
    • 1970-01-01
    相关资源
    最近更新 更多