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ê --transform
també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-names
e -v
são usados apenas para exibir os nomes de arquivos transformados.