Anexando o nome do diretório ao conteúdo do diretório tar.gz no shell

Anexando o nome do diretório ao conteúdo do diretório tar.gz no shell

Eu tenho um diretório de diretórios compactados, assim:

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

Dentro de cada diretório, alguns dos arquivos têm o mesmo nome. Ex.

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

Preciso descompactar cada diretório, renomear cada arquivo com o nome do diretório e recompactar os arquivos individuais. Minha saída desejada é:

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

Eu criei esse código, mas ele renomeia os arquivos para ter um literal $f em:

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

Saída:

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

Por favor, você pode me ajudar a converter o comando para que ele inclua os arquivos com o nome real da pasta? Obrigado.

Responder1

Com a implementação GNU de tar(de qualquer maneira, você --transformtambém é uma extensão GNU), você poderia fazer:

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

Responder2

Fazendo a extração e recompressão em duas etapas:

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

Opção --show-transformed-namese -vsão usados ​​apenas para exibir os nomes de arquivos transformados.

informação relacionada