실수로 두 번 압축된 파일이 있습니다.파일 확장자 없음
예를 들어 gzip -dc file
일부 파일은 일부 바이너리 횡설수설을 출력하지만 다른 파일은 괜찮습니다.
폴더에서 이중 gzip 압축 파일을 찾아서(모든 파일이 이중 gzip으로 압축된 것은 아니지만 모든 파일이 적어도 한 번은 있음) 자동으로 단일 gzip 압축 상태로 복원할 수 있는 명령을 실행하고 싶습니다.
답변1
다음을 수행할 수 있습니다.
for file in *; do
zcat -- "$file" |
file - |
grep -wq compressed &&
gunzip -- "$file"
done
이는 임의의 파일 이름으로 실행할 수 있다는 장점이 있습니다(예:당신의 방법으로 ls
, 참조http://mywiki.wooledge.org/ParsingLs) 또한 훨씬 더 단순해 보입니다. 적어도 나에게는 그렇게 보인다.
.gz
단점은 확장자가 없는 gzip 파일 로 끝날 수 있다는 것입니다 . 그러나 이것은 쉽게 해결됩니다:
for file in *; do
case "$file" in
*.gz) ;;
*) file -- "$file" |
grep -wq compressed &&
mv -v -- "$file" "$file".gz;;
esac
done
답변2
이것은 내가 사용하는 명령입니다:
ls | xargs -L1 -I[] sh -c 'basename "[]" | xargs -L1 -I{} sh -c "cp -a \"[]\" \"/tmp/{}.gz\" && gzip -d \"/tmp/{}.gz\" && file \"/tmp/{}\" | (grep compressed -q && rsync -a \"/tmp/{}\" \"[]\" --remove-source-files) || rm \"/tmp/{}\""'
기본적으로 파일을 복사하여 /tmp/
압축을 한 번 풀고, 새 파일이 아직 압축되어 있는지 확인하고( file some_file | grep compressed -q
), 그렇다면 원래 위치( )로 다시 이동하고 rsync source dest --remove-source-files
, 그렇지 않으면 임시 파일을 삭제합니다.