Agregar el nombre del directorio al contenido del directorio tar.gz en el shell

Agregar el nombre del directorio al contenido del directorio tar.gz en el shell

Tengo un directorio de directorios comprimidos, como este:

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

Dentro de cada directorio, algunos de los archivos tienen el mismo nombre. 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

Necesito descomprimir cada directorio, cambiar el nombre de cada archivo con el nombre del directorio y luego volver a comprimir los archivos individuales. Mi resultado deseado es:

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

Se me ocurrió este código, pero cambia el nombre de los archivos para que tengan un $f literal en:

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

Producción:

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

¿Podría ayudarme a convertir el comando para que anteponga los archivos con el nombre de la carpeta real? Gracias.

Respuesta1

Con la implementación GNU de tar( --transformde todos modos, también es una extensión GNU), podrías hacer:

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

Respuesta2

Haciendo la extracción y recompresión en dos pasos:

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

Opción --show-transformed-namesy -vsolo se utilizan para mostrar los nombres de archivos transformados.

información relacionada