Gunzip은 *.gz 파일을 다른 위치에 압축 해제합니다.

Gunzip은 *.gz 파일을 다른 위치에 압축 해제합니다.

이 코드는 여러 .tar 파일을 다른 위치로 추출하기 위해 작성되었으며 정상적으로 작동했습니다.

ls -1 ${short_filename} \
| while read file; do \
  tar -zxvf "$file" -C ${pentaho_temp_path}/${sessionkey}; \
done

Linux 시스템에서 .gz 파일로 동일한 작업을 수행하고 싶습니다. 내 파일 이름에는 공백이 없으며 다음과 같습니다.

xport_RAN_Maa_LIM_10.93.217.170_20220629030929.xml.gz
xport_RAN_Maa_LIM_10.93.217.170_20220630030936.xml.gz 
xport_RAN_Mau_MPU_10.188.83.138_20220629031403.xml.gz 
xport_RAN_Mau_MPU_10.188.83.138_20220630031444.xml.gz 

답변1

gzip 파일에는 "파일"이 포함되지 않고 단지 바이트 스트림만 포함됩니다. 따라서 압축을 풀고 싶다면 gzip -d --stdout "${file}" > "${target_directory}/${target_file}".

귀하의 스크립트에 유의하십시오.오직전용*.tar.gz-z, 벌써 깃발 때문에요 .

답변2

스크립트가 불필요하게 복잡합니다. 줄 바꿈은 모든 명령 시 |및 명령 뒤에 수행할 수 있으므로 줄이 필요하지 않습니다. 똑같은 스크립트를 다음과 같이 작성할 수 있습니다.do\

ls -1 "$short_filename" | 
    while read file; do
        tar -zxvf "$file" -C "$pentaho_temp_path/$sessionkey"
    done

그러나 이것은 나쁜 생각이다. 다른 사람들이 지적했듯이 구문 분석은 ls매우 취약하므로 피해야 합니다. 위 스크립트에 필요한 것은 모두 다음과 같기 때문에 이 경우에도 의미가 없습니다.

for file in "$short_filename"/*; do
    tar -zxvf "$file" -C "$pentaho_temp_path/$sessionkey"
done

그러나 파일이 모두 압축 해제되어 있으므로 .gz전혀 그럴 필요가 없으며 다음을 수행할 수 있습니다.tar

for file in "$short_filename"/*; do
    zcat "$file" > "$pentaho_temp_path/$sessionkey"/"$(basename "$file" .gz)"
done

답변3

생각해 보세요:

for file in "$short_filename"/*.gz; do
  zcat "$file" > "$pentaho_temp_path/$sessionkey/$(basename "$file" .gz)"
done
  • ls배관 출력 방지
  • .gz 확장자만 필터링
  • 확장자 없이 파일 이름을 분리하기 위해 전체 경로를 구문 분석합니다.basename "$fullpath" .gz

파일 이름에 개행 문자가 포함되어 있지 않다고 확신하는 경우 파일 이름을 파이핑하여 프로세스를 병렬화할 수 있습니다.

myzcat(){ zcat "$1" > "$pentaho_temp_path/$sessionkey/$(basename "$1" .gz)"; }

ls "$short_filename"/*.gz | parallel myzcat
  • 목록 모델 대신 파이프 사용
  • 단일 인수를 취하는 로컬 함수 정의
  • 프로세서 수만큼 병렬 프로세스 실행

관련 정보