디렉토리 구조를 유지하면서 디렉토리의 모든 PDF를 압축합니다.


11

내 디렉토리 중 하나에 존재하는 모든 PDF 파일이 들어있는 압축 tarball을 만들려고합니다. 디렉토리 구조를 유지해야합니다. 빈 디렉토리는 필요하지 않지만 실제로 있는지는 상관하지 않습니다.

예를 들어 다음과 같은 디렉토리가 있다고 가정 해보십시오.

dir
dir/subdir1
dir/subdir1/subsubdir1/song.mp3
dir/subdir2
dir/subdir2/subsubdir1
dir/subdir2/subsubdir1/document.pdf
dir/subdir2/subsubdir1/another-song.mp3
dir/subdir2/subsubdir1/top-ten-movies.txt
dir/subdir3
dir/subdir3/another-document.pdf

명령을 실행 한 후 다음을 dir.tar.gz포함 하고 싶습니다 .

dir
dir/subdir2
dir/subdir2/subsubdir1
dir/subdir2/subsubdir1/document.pdf
dir/subdir3
dir/subdir3/another-document.pdf

가능한?

답변:


10

모든 PDF가 나열됩니다.

$ find dir/ -name '*.pdf'
./dir/subdir2/subsubdir1/document.pdf
./dir/subdir3/another-document.pdf

당신은 할 수 있음을 파이프 할 수 있습니다 xargs것을 하나의 공백으로 구분 된 라인으로 그것을 얻을, 및 공급하는 tar아카이브를 만들 수를 :

$ find dir/ -name '*.pdf' | xargs tar czf dir.tar.gz

(이 방법은 빈 디렉토리를 생략합니다)


1
도움을 주셔서 감사합니다. 다음은 제가 생각 find docs \( -iname '*.pdf' -o -iname '*.mp3' \) -printf '"%p"\n' | xargs tar czf docs-media.tar.gz
Matt Alexander

3
@mattalexx : 파일 이름에 공백이나 \'"(xargs 's fault)가 포함되어 있으면이 명령이 작동하지 않으며 파일 이름 이 너무 많으면 (kernel 's fault) 작동하지 않습니다.
Gilles 'SO- 악의를 그만두십시오'

2
@Gilles 공백과 작은 따옴표가있는 파일 이름과 관련하여 -printf '"%p"\n'부분은 그것을 처리합니다 (적어도 나를 위해했습니다).
매트 알렉산더

1
@Gilles 커널 제한에 관심이있다. 리눅스에서 하나의 명령으로 몇 개의 주장을 가질 수 있습니까?
매트 알렉산더

5
오, "작동하지 않을 것"에서, 여기서 실패 모드는 명령 행이 너무 길면, xargs가 그것을 분할 하여 마지막 tar 호출이 이전 호출에 의해 작성된 파일을 자동으로 겹쳐 쓰는 것 입니다.
Gilles 'SO- 악마 그만해'

6

bash ≥4 또는 zsh 및 GNU tar를 사용하는 경우 :

tar -czf dir.tar.gz dir/**/*.pdf

매우 많은 수의 PDF 파일이 있고 명령 행이 너무 길면 작동하지 않을 수 있습니다. 그런 다음보다 복잡한 찾기 기반 솔루션 (GNU tar 사용)이 필요합니다.

tar -cf dir.tar -T /dev/null
find dir -name '*.pdf' -exec tar -rf dir.tar {} +
gzip dir.tar

또는 (그리고 이식 가능하게) pax로 아카이브를 만들 수 있습니다 .

pax -w -x ustar -s '/\.pdf$/&/' -s '/.*//' . | gzip >dir.tar.gz

첫 번째 -s.pdf이름을 변경하지 않고 모든 파일 을 포함 시키라고 말합니다 . 두 번째 -s는 다른 모든 파일의 이름을 빈 이름으로 바꾸겠다고 말하며 실제로 아카이브에 포함하지 않습니다.


네, zsh를 언급하고 싶습니다 **. 나는 bash 4가 지금 그것을 가지고 있다는 것을 몰랐다
Michael Mrozek
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.