シェルで tar.gz ディレクトリの内容にディレクトリ名を追加する

シェルで tar.gz ディレクトリの内容にディレクトリ名を追加する

次のような圧縮ディレクトリのディレクトリがあります。

MainDirectory/FolderA.tar.gz
MainDirectory/FolderB.tar.gz

各ディレクトリ内では、一部のファイルの名前が同じです。例:

MainDirectory/FolderA.tar.gz/file1.fasta
MainDirectory/FolderA.tar.gz/file2.fasta
MainDirectory/FolderB.tar.gz/file1.fasta
MainDirectory/FolderB.tar.gz/file1.fasta

各ディレクトリを解凍し、各ファイルの名前をディレクトリ名に変更してから、個々のファイルを再圧縮する必要があります。必要な出力は次のとおりです。

MainDirectory/FolderA_file1.fasta.bz2
MainDirectory/FolderA_file2.fasta.bz2
MainDirectory/FolderB_file1.fasta.bz2
MainDirectory/FolderB_file1.fasta.bz2

私はこのコードを思いつきましたが、ファイル名が変更され、リテラル $f が含まれるようになります:

cd MainDirectory/
for f in *.tar.gz
    do
    tar -xvzf $f --transform 's,^,${f},' 
    pbzip2 *.fastq 
    done

出力:

MainDirectory/'${f}file1.fastq.bz2'
MainDirectory/'${f}file2.fastq.bz2'

コマンドを変換して、実際のフォルダー名をファイルの先頭に追加するようにしていただけますか? ありがとうございます。

答え1

の GNU 実装tar(--transformいずれにせよ も GNU 拡張です) を使用すると、次の操作を実行できます。

cd MainDirectory &&
  for f in *.tar.gz; do
    PREFIX=${f%.tar.gz} tar -xvvzf "$f" --to-command='
      pbzip2 > "${PREFIX}_$TAR_FILENAME.bz2"'
  done

答え2

抽出と再圧縮を 2 つのステップで実行します。

cd MainDirectory && for f in *.tar.gz; do
  tar --transform="s,^,${f%.tar.gz}_," --show-transformed-names -xvzf "$f"
done && pbzip2 *.fasta

オプション--show-transformed-namesは、-v変換されたファイル名を表示するためにのみ使用されます。

関連情報