![여러 하위 디렉터리에서 압축 풀기 및 gzip](https://linux55.com/image/60818/%EC%97%AC%EB%9F%AC%20%ED%95%98%EC%9C%84%20%EB%94%94%EB%A0%89%ED%84%B0%EB%A6%AC%EC%97%90%EC%84%9C%20%EC%95%95%EC%B6%95%20%ED%92%80%EA%B8%B0%20%EB%B0%8F%20gzip.png)
여러 하위 디렉터리로 구성된 디렉터리가 있습니다. 각 하위 디렉터리에는 파일이 있으며 압축 tar.gz
을 풀면 두 개의 파일이 제공됩니다 R1.fastq
. R2.fastq
tar 파일의 압축을 풀고 파이핑한 후 즉시 압축하고 R1.fastq
각 R2.fastq
하위 디렉터리의 출력을 다른 SINGLE 디렉터리에 저장하고 싶습니다.
sourcedir=/sdir
destdir=/ddir
for f in $sourcedir/*; do
fbase=${f##*/}
echo "Inside $fbase"
tar -xvf $f/*.gz |gzip -n9 $f/*.fastq > $destdir/
done
위의 코드를 작성했지만 명령이 실행될 때까지 계속 유지됩니다 echo
.
답변1
$f/*.fastq
이 줄이 호출되면 아무 것도 일치하지 않습니다. 그러나 주요 문제는 tar
표준 출력으로 추출하지 않고 파일을 생성한다는 것입니다(파이프의 다른 쪽 끝에 있는 "수신"에게 한 파일이 끝나고 다른 파일이 시작된다는 것을 알리는 방법이 필요하지만 적어도 그렇지 않습니다). 아니다) tar
.
따라서 사용시 반드시 tar
파일을 먼저 생성하신 tar
후 gzip
생성된 파일을 생성하셔야 합니다.
파일이 메모리에 맞으면 Python tarfile
과 gzip
모듈을 사용하여 빠른 스크립트를 작성할 수 있으며 압축되지 않은 코드가 디스크에 닿지 않도록 할 수 있습니다. IIRC 개별 파일은 완전히 추출되므로 이 작업이 작동하려면 파일이 메모리에 맞아야 합니다.
답변2
일반적인 접근 방식은 아카이브에서 파일 이름을 읽은 다음(항상 동일하지 않은 경우) tar
한 번에 하나의 파일만 추출하는 것입니다. GNU에는 파일 쓰기를 방지하는 tar
옵션이 있습니다 . --to-stdout
그렇지 않으면 파일 이름당 FIFO가 필요합니다.
> tar -tf subdir.tar.gz
R1.fastq
R1.fastq
tar -xf subdir.tar.gz --to-stdout R1.fastq | gzip -n9 >/path/to/R1.fastq.gz
tar -xf subdir.tar.gz --to-stdout R2.fastq | gzip -n9 >/path/to/R2.fastq.gz