【问题标题】:Terminal/bash: Join several .gz spplited files终端/bash:加入几个 .gz 拆分文件
【发布时间】:2018-04-14 11:58:34
【问题描述】:

我对终端不是很熟悉,但我正在尝试加入几个拆分的 .tar.gz 文件,例如

  • file1.tar.gz_aa
  • file1.tar.gz_ab
  • file2.tar.gz_aa
  • file2.tar.gz_ab

在同一个文件夹中,但我只能使用以下方法将它们全部放在同一个文件中:

for i in *.gz_; do cat ${i%/}* > "${i%/}".joined; done

我尝试过这样的“嵌套”循环:

for i in *.gz_;do for y in ${i}.gz_* do cat ${i}.gz_${y} > ${i}.joined; done; done

但我在意外标记 `>' 附近遇到语法错误

编辑:我正在使用 Xubuntu(不确定是否重要),我的目标是加入原始状态的文件(file1.tar.gz 和 file2.tar.gz) . 我也在尝试使用${name%.tar.gz*} 将文件名放入一个数组中,但我对此很陌生,我还不知道如何删除重复项然后“cat”它们(sort -u 没有用)

【问题讨论】:

    标签: linux join terminal cat gzip


    【解决方案1】:

    试试这个..

    zcat file1.tar.gz_aa file1.tar.gz_ab file2.tar.gz_aa file2.tar.gz_ab | gzip -c > joined.gz
    

    【讨论】:

    • 谢谢,使用该命令时出现“文件意外结束”错误 + 我需要选择这些文件而不指定它们的名称,例如将它们添加到循环内的变量或其他内容中,但我无法找到方法。
    • 查找 /root -maxdepth 1 -type f -name '*.gz_*' | gzip -c >joined1.gz
    • 将 /root 替换为您的路径。如果您仍有问题,请告诉我
    • 该文件夹内的那个和这个find -type f -name '*.gz_*' | gzip -c > joined1.gz 会创建一个具有该名称的 52 字节文件,但不会加入它们。无论如何,我希望将它们全部加入一个存档,但我的目标是 file1.tar.gz 和 file2.tar.gz。我将编辑原件以澄清这一点。
    • 试试这个find /root -maxdepth 1 -type f -name 'file1*.gz_*' | cat > file1.tar.gz
    【解决方案2】:

    耶耶,我终于明白了!! 我确信并希望有更多知识的人可以简化此操作,但它目前可以满足我的要求,

    1st:将文件名分配给不带扩展名的数组

    for name in *.gz_*; do arrname+=(${name%.tar.gz*}); done 
    

    第 2 次​​strong>:消除重复项(来自其他 question

    uniq=($(echo "${arrname[@]}" | tr ' ' '\n' | sort -u | tr '\n' ' '))

    第 3 次:加入各自的原始状态

    for i in ${uniq[@]}; do cat $i.tar.gz_** > $i.joined.tar.gz; done

    一次性: for name in *.gz_*; do arrname+=(${name%.tar.gz*}); done && uniq=($(echo "${arrname[@]}" | tr ' ' '\n' | sort -u | tr '\n' ' ')) && for i in ${uniq[@]}; do cat $i.tar.gz_** > $i.joined.tar.gz; done

    【讨论】:

      猜你喜欢
      • 2015-05-20
      • 2010-10-05
      • 2010-12-27
      • 2011-09-14
      • 1970-01-01
      • 1970-01-01
      • 2013-05-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多