gz 확장자가 없는 gzip 파일의 일괄 압축 풀기

gz 확장자가 없는 gzip 파일의 일괄 압축 풀기

..0_1234 .0_4213.0_4132그 중 일부는 gzip압축되어 있고 일부는 원시 이메일입니다. 어떤 것이 압축된 파일인지 확인하고, 해당 파일의 압축을 풀고, 모든 압축 파일의 압축을 푼 후 모든 파일의 이름을 공통 확장자로 바꿔야 합니다. 나는 file 명령을 사용하여 무엇이 압축되었는지 확인한 다음 결과를 grep하고 를 sed사용하여 출력을 파일 목록으로 줄일 수 있다는 것을 알았습니다. 그러나 겉보기에 무작위로 보이는 확장자를 압축 해제하는 방법을 알 수는 없었습니다. 이것이 내가 지금까지 가지고 있는 것입니다

file *|grep gzip| sed -e 's/: .*$//g'

xargs출력에 제공된 파일 목록을 가져와 .gz압축을 풀 수 있도록 이름을 바꾸거나 간단히 온라인으로 압축을 풀기 위해 또는 무언가를 사용하고 싶습니다 .

답변1

사용하지 말고 gzip대신 zcat확장이 필요하지 않은 것을 사용하십시오. 한 번에 모든 것을 할 수 있습니다. 파일을 시도해 보세요 zcat. 압축되지 않아서 실패하면 cat다음과 같이 됩니다.

for f in *; do 
    ( zcat "$f" || cat "$f" ) > temp && 
    mv temp "$f".ext && 
    rm "$f" 
done

위 스크립트는 먼저 zcat파일 쓰기를 시도 temp하고, 실패할 경우(파일이 gzip 형식이 아닌 경우) cat직접 쓰기를 시도합니다. 이는 서브셸에서 실행되어 명령 실행의 출력을 캡처하고 이를 임시 파일( temp)로 리디렉션합니다. 그런 다음 temp원본 파일 이름과 확장명( .ext이 경우)으로 이름을 바꾸고 원본 파일을 삭제합니다.

답변2

당신은 다음과 같은 것을 할 수 있습니다

for f in ./*
do 
gzip -cdfq "$f" > "${f}".some_ext
done

그러면 모든 파일(압축되지 않은 파일도 pass -f)을 처리하고 쓰기(pass -c)하고 출력합니다.표준 출력 리디렉션을 사용하여 각 파일의 내용을 .some_ext해당 파일에 저장합니다. 그런 다음 원본을 삭제할 수 있습니다.bash

shopt extglob
rm -f ./!(*.some_ext)

또는zsh

setopt extendedglob
rm -f ./^*some_ext

생성된 파일을 다른 디렉터리에 저장할 수도 있습니다(이번에는 원래 확장자를 제거한다고 가정).

for f in *
do 
gzip -cdfq -- "$f" > /some/place/else/"${f%.*}".some_ext
done

그런 다음 현재 디렉터리의 모든 항목을 삭제합니다.

답변3

그러면 gzip을 사용하여 압축된 모든 파일 목록이 표시됩니다.

file /path/to/files | grep ': gzip compressed data' | cut -d: -f1

.gzgzip으로 압축된 파일에 확장자를 추가 하려면 다음과 같은 추악한 해킹을 수행할 수 있습니다.

for file in ./*; do
    if gzip -l "$file" > /dev/null 2>&1; then
        case "$file" in
          *.gz) :;; # The file already has the extension corresponding to its format
          *) mv "$file" "${file}.gz";;
        esac
        # Uncomment the following line to decompress them at the same time
        # gunzip "${file}.gz"
    fi
done

관련 정보