디렉토리의 모든 파일을 자체 압축 파일로 압축


24

각 파일의 이름을 유지하면서 디렉토리의 모든 파일을 자체 tar로 압축하는 방법은 무엇입니까?

즉 file1.out file2.out

->

file1.out.tar.gz file2.out.tar.gz

답변:


64

이 시나리오에서는 모든 파일을 별도의 tar 파일에 넣는 것이 의미가 없습니다. gzip직접 압축하는 데 사용할 수 있습니다 .

gzip *

초래 것 file1.out.gz, file2.out.gz등등

tar압축 된 아카이브가 단일 파일로 필요한 경우에만 사용 합니다.

모든 파일에 대해 tar 아카이브가 필요한 경우 다음과 같이 만들 수 있습니다.

for i in *; do tar -czf $i.tar.gz $i; done

7
+1-단일 파일에 대해 tar (Tape ARchive)를 생성 할 이유가 없습니다. 압축하려는 것을 압축하면 결과가 약간 작아지고 파일을 추출하는 사람들에게 무한한 의미가 있습니다.
voretaq7

각 개별 서브 디렉토리를 tar하고 (한 레벨 만) 원본을 제거하려면find . -maxdepth 1 -type d ! -path . | while read a_dir; do tar -zcvf ${a_dir}.tgz ${a_dir} --remove-files; done
xb.

(5 분 후 위의 설명을 편집 할 수 없음) 더 단순하고 안전한 버전 :find . -maxdepth 1 -mindepth 1 -type d -exec tar -zcvf {}.tgz {} --remove-files \;
xb.

9

@SvenW의 답변을 바탕으로 (현재 디렉토리에서만 작동합니다) 파일 수가 많거나 재귀 디렉토리 구조에서 수행하려는 경우에도 사용할 수 있습니다

find . -type f -exec gzip \{\} \;

출력을 다른 디렉토리 (이 예에서는 ../target)에 넣고 원본을 제거하지 않으려는 경우 다음과 같이 할 수 있습니다.

find . -type f -print | while read fname ; do
    mkdir -p "../target/`dirname \"$fname\"`"
    gzip -c "$fname" > "../target/$fname.gz"
done

1
find . -type f -exec gzip {} \;충분합니다. 두 번째 코드는 공백 등을 포함하는 파일 이름으로 실패합니다.
사용자 알 수 없음

일부 쉘은 {}을 좋아하지 않으며, 두 번째 쉘은 첫 번째와 현저히 다른 작업을 수행합니다 (간격 문제를 알고 있었지만 다루기가 까다로 웠습니다).
푹신한

당신이 이러한 쉘을 알고 있다면, 나는 여기 위에 내 질문에 대답하는 당신을 초대합니다 : unix.stackexchange.com/questions/8647/...를 . 오늘날까지 사용되고있는 이름을 가진 사람은 아무도 없었습니다. 답변의 위험을 알고 있다면 답변에 이름을 지정하는 것이 좋습니다.
사용자 알 수 없음

@userunknown 나는 (t) csh를 키웠는데, 이스케이프 처리되지 않은 중괄호에는 더 이상 문제가 없지만 더 이상 나타나지는 않습니다 (그러나 여전히 {}습관의 힘으로 탈출합니다 ). 그러나 다른 사람들은 이미 귀하의 질문에 대한 답변으로 게시했습니다.
푹신한

또는 모든 비 이진 파일을 압축하려면find . -type f -exec grep -Iq . {} \; -and -exec gzip {} \;
xb.

0

이거 한번 해봐:

#!/bin/bash
for fich in *; do
    if [ "$fich" != "*" ] ; then
        gzip -9 -c $fich > $fich.tar.gz
        \mv $fich.tar.gz $fich
    fi
done
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.