나중에 원본을 삭제하지 않고 하위 디렉토리의 모든 파일을 포함하여 디렉토리의 모든 파일을 별도로 압축해야합니다. index.html이 있다고 가정하겠습니다. index.html.gzip AND index.html의 끝에 있습니다.
내 디렉토리의 모든 파일을 통해 gzip으로 압축 할 수 있습니다
gzip -r .
그러나 원본 파일도 유지하고 싶습니다.
이것이 가능한가?
나중에 원본을 삭제하지 않고 하위 디렉토리의 모든 파일을 포함하여 디렉토리의 모든 파일을 별도로 압축해야합니다. index.html이 있다고 가정하겠습니다. index.html.gzip AND index.html의 끝에 있습니다.
내 디렉토리의 모든 파일을 통해 gzip으로 압축 할 수 있습니다
gzip -r .
그러나 원본 파일도 유지하고 싶습니다.
이것이 가능한가?
답변:
find . -type f | \
while read -r x
do
gzip -c "$x" > "$x.gz"
done
이 -c
결과는 stdout으로 결과를 푸시하고 원본 만 유지합니다. 단점은 파일을 직접 찾아야한다는 것입니다. 보다 정교한 트래버스를 위해 find(1)
위와 같이를 사용할 수 있습니다 : .
현재 디렉토리에서 시작하여 검색하고 -type f
모든 일반 파일의 이름을 반환합니다.
*.*
정기적으로 이름이 지정된 모든 파일과 일치하며 일반적으로 디렉토리가 없습니다. 물론 대부분의 경우에만 작동하며 필요한 경우 일반적으로 작동하지 않습니다. 그런 다음 find
명령을 사용하십시오 .
ls
필요하지 않은 모든시 : for x in *
. 그러나을 find
사용해야합니다 find . -type f | while read -r x
.
-r
스위치를 켜 주셔서 감사합니다 read
.
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는 어쩌면 그것이 아닐 수도 있습니다. 찾기에서 직접 건너 뛸 수 있습니다.
gzip 1.6 (2013 년 6 월)에 -k, --keep
옵션이 추가 되었으므로 이제 다음을 수행 할 수 있습니다.
gzip -kr .
/unix/46786/how-to-tell-gzip-to-keep-original-file 에서 찾을 수 있습니다.
gzip -rc `ls` > archive.gz
데비안에서 테스트 (gzip 1.3.12-6)
ls
불필요합니다 *
.를 사용하십시오 .
*.*
에ls
?