遍历 .tar.gz 目录并连接文件(不解压缩文件夹)

Posted

技术标签:

【中文标题】遍历 .tar.gz 目录并连接文件(不解压缩文件夹)【英文标题】:Traverse through .tar.gz directories and concatenate files (without uncompressing the folders) 【发布时间】:2016-08-08 14:43:15 【问题描述】:

我有一个包含大约 20000 个 tar.gz 目录的文件夹,每个目录都包含一堆文件。我想进入源文件夹,遍历 tar.gz 目录(无需解压缩)并连接文件,这样最后我将拥有三个大文件。

例如我有一个根文件夹pnoc,其中有.tar.gz 目录,每个压缩文件夹都有三个文件夹-KallistoRSEMHugo。我已经解压缩了一个这样的目录,看起来像这样:

pnoc/
├── C021_0001_20140916_tumor_RNASeq.tar.gz
├── C021_0002_001113_tumor_RNASeq.tar.gz
├── C021_0003_001409_tumor_RNASeq.tar.gz
├── C021_0004_001418_tumor_RNASeq.tar.gz
├── C021_0005_001661_tumor_RNASeq.tar.gz
├── C021_0007_001669_tumor_RNASeq.tar.gz
├── C021_0008_001699_tumor_RNASeq.tar.gz
├── C021_0009_001766_tumor_RNASeq.tar.gz
├── C021_0010_001774_tumor_RNASeq.tar.gz
├── C021_0011_001786_tumor_RNASeq.tar.gz
├── C021_0012_001825_tumor_RNASeq.tar.gz
├── C021_0013_001872_tumor_RNASeq.tar.gz
├── CPBT_0001_1_tumor_RNASeq.tar.gz
├── CPBT_0003_1_tumor_RNASeq.tar.gz
├── CPBT_0004_1_tumor_RNASeq.tar.gz
├── CPBT_0005_1_tumor_RNASeq.tar.gz
├── CPBT_0006_1_tumor_RNASeq.tar.gz
├── CPBT_0007_1_tumor_RNASeq.tar.gz
├── CPBT_0008_1_tumor_RNASeq.tar.gz
├── CPBT_0009_1_tumor_RNASeq.tar.gz
├── IMPROPERLY_PAIRED.C021_0006_001666_tumor_RNASeq.tar.gz
└── pnoc-manifest


C021_0001_20140916_tumor_RNASeq
├── Kallisto
│   ├── C021_0001_20140916_tumor_RNASeq.abundance.h5
│   ├── C021_0001_20140916_tumor_RNASeq.abundance.tsv
│   └── C021_0001_20140916_tumor_RNASeq.run_info.json
└── RSEM
    ├── C021_0001_20140916_tumor_RNASeq.rsem.genes.norm_counts.tab
    ├── C021_0001_20140916_tumor_RNASeq.rsem.genes.raw_counts.tab
    ├── C021_0001_20140916_tumor_RNASeq.rsem.isoform.norm_counts.tab
    ├── C021_0001_20140916_tumor_RNASeq.rsem.isoform.raw_counts.tab
    ├── C021_0001_20140916_tumor_RNASeq.rsem_genes.results
    ├── C021_0001_20140916_tumor_RNASeq.rsem_isoforms.results
    └── Hugo
        ├── C021_0001_20140916_tumor_RNASeq.rsem.genes.norm_counts.hugo.tab
        ├── C021_0001_20140916_tumor_RNASeq.rsem.genes.raw_counts.hugo.tab
        ├── C021_0001_20140916_tumor_RNASeq.rsem.isoform.norm_counts.hugo.tab
        ├── C021_0001_20140916_tumor_RNASeq.rsem.isoform.raw_counts.hugo.tab
        ├── C021_0001_20140916_tumor_RNASeq.rsem_genes.hugo.results
        └── C021_0001_20140916_tumor_RNASeq.rsem_isoforms.hugo.results

所以我想将所有 *.abundance.tsv 连接到一个文件中,*.rsem.genes.norm_counts.tab 在第二个文件中,*.rsem_genes.hugo.results 在第三个文件中。最好和最有效的方法是什么?我可以接受任何事情 - RPythonBash

$ find --version
find (GNU findutils) 4.5.11
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Eric B. Decker, James Youngman, and Kevin Dalley.
Features enabled: D_TYPE O_NOFOLLOW(enabled) LEAF_OPTIMISATION SELINUX FTS(FTS_CWDFD) CBO(level=2) 

谢谢!

【问题讨论】:

一定要用python/r吗?一个简单的 bash 脚本可能会更快。 :) 是的,我可以使用任何东西,我只想提示您进入 tar.gz 的第一部分,而无需解压缩和连接文件。 【参考方案1】:

使用bash find 命令如下; exec 中的cat 命令应用于该命令返回的所有文件。 + 选项是为了确保 shell 生成的 cat 实例不超过一个。

这里 表示文件返回了查找命令。参考更多关于find -exec

find . -type f -name '*.abundance.tsv' -exec cat "" + >> ../AbundanceTSV.tsv
find . -type f -name '*.rsem.genes.norm_counts.tab' -exec cat "" + >> ../GenesNormCounts.tab
find . -type f -name '*.rsem_genes.hugo.results' -exec cat "" + >> ../HugoResults.results

【讨论】:

你能解释一下这个命令在做什么吗?谢谢!为什么需要../ @KomalRathi:很好!这是为了确保输出文件不会被find 处理为它的输入。 我得到一个空的结果。是不是因为二级目录都被压缩了?因为我做了find ./pnoc/ -type f -name '*.abundance.tsv',它没有返回任何东西。 让我们continue this discussion in chat. 我希望在不解压缩 .tar.gz 文件夹的情况下连接文件。

以上是关于遍历 .tar.gz 目录并连接文件(不解压缩文件夹)的主要内容,如果未能解决你的问题,请参考以下文章

如何在不解压缩内容的情况下查看 .tar.gz 存档中特定文件的内容?

Windows本地目录下使用Java 将文本文件压缩为[.tar.gz],并实现文件解压

Windows本地目录下使用Java 将文本文件压缩为[.tar.gz],并实现文件解压

递归遍历tar文件,提取指定扩展名的所有文件

没有解压的 40GB tar.gz 文件中的行数?

linux中解压缩并安装.tar.gz后缀的文件