모든 파일을 삭제하지 않고 gzip


11

나중에 원본을 삭제하지 않고 하위 디렉토리의 모든 파일을 포함하여 디렉토리의 모든 파일을 별도로 압축해야합니다. index.html이 있다고 가정하겠습니다. index.html.gzip AND index.html의 끝에 있습니다.

내 디렉토리의 모든 파일을 통해 gzip으로 압축 할 수 있습니다

gzip -r .

그러나 원본 파일도 유지하고 싶습니다.

이것이 가능한가?

답변:


9
find . -type f | \
while read -r x
do
  gzip -c "$x" > "$x.gz"
done

-c결과는 stdout으로 결과를 푸시하고 원본 만 유지합니다. 단점은 파일을 직접 찾아야한다는 것입니다. 보다 정교한 트래버스를 위해 find(1)위와 같이를 사용할 수 있습니다 : .현재 디렉토리에서 시작하여 검색하고 -type f모든 일반 파일의 이름을 반환합니다.


*.*ls?

@pooh : *.*정기적으로 이름이 지정된 모든 파일과 일치하며 일반적으로 디렉토리가 없습니다. 물론 대부분의 경우에만 작동하며 필요한 경우 일반적으로 작동하지 않습니다. 그런 다음 find명령을 사용하십시오 .
Boldewyn

@ Boldewyn : 문제는 모든 파일을 gzip으로 압축하는 것이 었습니다. TODOls *.* 와 같은 파일을 선택하지 않습니다 .

ls필요하지 않은 모든시 : for x in *. 그러나을 find사용해야합니다 find . -type f | while read -r x.
추후 공지가있을 때까지 일시 중지되었습니다.

답변이 업데이트되었습니다. -r스위치를 켜 주셔서 감사합니다 read.
Boldewyn

5
find . -type f -not \( -name '*.gz' -or -name '*[~#]' \) -exec sh -c 'gzip -c "{}" > "{}.gz"' \;

-name '*.txt -or -name '*.html일부 파일 (이미 압축, 백업 및 임시 파일)을 제외하고 지금 대신 압축하려는 항목 등 을 포함하도록 쉽게 전환 할 수 있습니다 .

파일 이름의 공백도 잘 처리합니다.

변경 gzip에 대한 echo gzip테스트. 또는 -exec 부분을 모두 건너 뜁니다.

편집 : 아, 나는 이것이 <target>.gz이미 존재 하는지 확인하지 않았다는 것을 잊어 버렸습니다 . 이것은 문제 일 수도 있고 아닐 수도 있습니다.

Edit2 : 좋아, 여기에 기존 파일을 확인하는 것이 있습니다. 그럴 수도 있습니다. 일리 니스를 용서하십시오.

while read file; do if [ ! -f "$file.gz" ]; then echo "Compressing $file"; gzip -c "$file" > "$file.gz"; else echo "Not overwriting $file.gz";  fi  done < <(find . -type f -not \( -name '*.gz' -or -name '*[~#]' \))

find-foo는 어쩌면 그것이 아닐 수도 있습니다. 찾기에서 직접 건너 뛸 수 있습니다.


1
모든 파일에서 stat를 호출하지 않도록 -name이 -type 앞에 와야 함을 읽으십시오.

@Ben 말이되고, 좋은 입력! 큰 나무의 경우 눈에 띄게 나타날 수 있습니다.
plundra



당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.