쉘의 tar.gz 디렉토리 내용에 디렉토리 이름을 추가하십시오.

쉘의 tar.gz 디렉토리 내용에 디렉토리 이름을 추가하십시오.

다음과 같은 압축된 디렉터리 디렉터리가 있습니다.

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

각 디렉터리에는 일부 파일의 이름이 동일합니다. 전임자.

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

각 디렉터리의 압축을 풀고 각 파일의 이름을 디렉터리 이름으로 바꾼 다음 개별 파일을 다시 압축해야 합니다. 내가 원하는 출력은 다음과 같습니다.

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

이 코드를 생각해 냈지만 다음 위치에 $f 리터럴을 포함하도록 파일 이름을 바꿉니다.

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

산출:

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

파일 앞에 실제 폴더 이름이 추가되도록 명령을 변환하도록 도와주세요. 감사해요.

답변1

GNU 구현을 사용하면 tar( --transform어차피 GNU 확장자임) 다음을 수행할 수 있습니다.

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

답변2

추출과 재압축은 두 단계로 수행됩니다.

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

옵션 --show-transformed-names이며 -v변환된 파일 이름을 표시하는 데에만 사용됩니다.

관련 정보