모든 하위 디렉토리에서 특정 파일 유형을 tar하는 방법은 무엇입니까?


86

tar와 모든 .php 및 .html 파일을 디렉토리와 하위 디렉토리에두고 싶습니다. 내가 사용한다면

tar -cf my_archive *

내가 원하지 않는 모든 파일을 tars합니다. 내가 사용한다면

tar -cf my_archive *.php *.html

하위 디렉터리를 무시합니다. 재귀 적으로 tar를 만들지 만 두 가지 유형의 파일 만 포함하려면 어떻게해야합니까?

답변:


146

find ./someDir -name "*.php" -o -name "*.html" | tar -cf my_archive -T -


@DeeDee 파일 수 등에 제한이 있습니까?
user1566515 2013-09-11

1
@DeeDee-아니, 내가 의미하는 것은 괄호가 필요하지 않다는 것입니다!
Mike Makuch 2013 년

@ user1566515 파일 시스템 제한이나 전체 공간 제한이있어 tar 파일에 상한선을 설정할 수 있습니다. 그것은 전적으로 자신의 시스템에 달려 있습니다. 그렇지 않으면 파이핑이 본질적으로 즉시 tar 파일을 생성하므로 파일 번호 나 크기에 의해 제한되지 않습니다.
DeeDee 2013 년

감사! ... 2 개 이상의 조건 ​​/ 종류의 파일을 추가하는 방법은 무엇입니까?
gluuke 2014 년

5
@gluuke 사용하는 -o -name [pattern]각각의 새로운 조건
디디

15

bash버전> 4.0을 사용하는 경우 다음 shopt -s globstar과 같은 짧은 작업을 수행 할 수 있습니다 .

shopt -s globstar; tar -czvf deploy.tar.gz **/Alice*.yml **/Bob*.json

이렇게하면 임의의 하위 디렉터리에서 Alice로 시작하는 모든 .yml 파일이 추가되고 임의의 하위 디렉터리에서 Bob으로 시작하는 모든 .json 파일이 추가됩니다.


2
tar 만 사용하는 유일한 답변, IMO의 베스트 답변입니다.
simon

2
디렉토리에 대한 glob '**'의 인상에도 불구하고이 명령은 재귀 적으로 실행되지 않습니다 (모든 하위 폴더)
Eddie

@Eddie **가 작동합니다. 매개 변수에 다른 것이있을 수 있습니다. 또한 명령 줄에서 전달하는 폴더 이름에 공백이 있는지 확인하십시오. 그렇지 않은 경우 실제 명령을 붙여 넣을 수 있습니까?
Sairam Krish

'**'는 명령에 도달하기 전에 쉘에 의해 평가되며 0 또는 문자로 해석되는 2 개의 독립적 인 *로만 표시되며 tldp.org/LDP/GNU-Linux-Tools-Summary/
Eddie

2
bash는> 4.0이 가지고 있지만 @eddie 예 그것은, 쉘에 의해 평가 shopt -s globstar옵션을 대답은 정확하고 실제로 가장 좋은 하나입니다, 그래서
로마 Usherenko

13

한 가지 방법은 다음과 같습니다.

tar -cf my_archive.tar $( find -name "*.php" -or -name "*.html" )

그러나이 방법에는 몇 가지주의 사항이 있습니다.

  1. 공백이있는 파일이나 디렉토리가 있으면 실패합니다.
  2. 파일이 너무 많아 최대 명령 줄 길이가 꽉 차면 실패합니다.

이에 대한 해결 방법은 find 명령의 내용을 파일로 출력 한 다음 "-T, --files-from FILE"옵션을 사용하여 tar에 사용하는 것입니다.


1) "실패"란 공백이있는 파일을 건너 뛰거나 tar 아카이브가 생성되지 않음을 의미합니까? 2) 약 10 만 개의 파일이 있습니다. 최대 명령 줄 길이를 초과합니까?
user1566515 2013 년

1
1. 아카이브를 생성하지만 누락 된 파일을보고합니다. 2. 너무 길어질 것 같습니다. 이것을 감안할 때 @DeeDee가 아래에서 제안하는 것과 같은 방법을 사용하는 것이 가장 좋을 것입니다. 이러한 문제를 아주 잘 해결할 수 있습니다.
Robin Sheat 2013 년


0

파일에 넣어

find . \( -name "*.php" -o -name "*.html" \) -print > files.txt

그런 다음 파일을 tar에 대한 입력으로 사용하고 사용하는 tar 버전에 따라 -I 또는 -T를 사용하십시오.

h를 사용하여 심볼릭 링크 복사

tar cfh my.tar -I files.txt 

0

find ./ -type f -name "*.php" -o -name "*.html" -printf '%P\n' |xargs tar -I 'pigz -9' -cf target.tgz

멀티 코어 또는 단일 코어의 경우 :

find ./ -type f -name "*.php" -o -name "*.html" -printf '%P\n' |xargs tar -czf target.tgz


-2
tar -cf my_archive `find ./ | grep '.php\|.html'`

"find"및 "grep"을 사용하여 모든 디렉토리 및 하위 디렉토리에있는 .php 및 .html 파일의 모든 경로를 가져옵니다. 그런 다음 압축 할 경로 정보를 tar에 전달합니다.

`및 '기호에주의하십시오. 또한 이것은 다른 답변과 달리 쉘이 명령 줄에서 허용하는 문자 수의 한계에 도달합니다.

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