Anhängen des Verzeichnisnamens an den Inhalt des Tar.gz-Verzeichnisses in der Shell

Anhängen des Verzeichnisnamens an den Inhalt des Tar.gz-Verzeichnisses in der Shell

Ich habe ein Verzeichnis mit komprimierten Verzeichnissen, wie dieses:

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

Innerhalb jedes Verzeichnisses haben einige Dateien den gleichen Namen. Beispiel:

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

Ich muss jedes Verzeichnis dekomprimieren, jede Datei mit dem Namen des Verzeichnisses umbenennen und dann die einzelnen Dateien erneut komprimieren. Meine gewünschte Ausgabe ist:

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

Ich habe mir diesen Code ausgedacht, aber er benennt die Dateien so um, dass sie ein wörtliches $f enthalten:

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

Ausgabe:

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

Können Sie mir bitte helfen, den Befehl so umzuwandeln, dass den Dateien stattdessen der tatsächliche Ordnername vorangestellt wird? Danke.

Antwort1

Mit der GNU-Implementierung von tar(Ihre --transformist ohnehin auch eine GNU-Erweiterung) könnten Sie Folgendes tun:

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

Antwort2

Die Extraktion und Neukomprimierung erfolgt in zwei Schritten:

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

Die Optionen --show-transformed-namesund -vdienen ausschließlich der Anzeige der transformierten Dateinamen.

verwandte Informationen