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
( --transform
de 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-names
y -v
solo se utilizan para mostrar los nombres de archivos transformados.