이 코드는 여러 .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
- 목록 모델 대신 파이프 사용
- 단일 인수를 취하는 로컬 함수 정의
- 프로세서 수만큼 병렬 프로세스 실행