와일드 카드 파일 패턴이있는 tar -C


17

tar 명령을 사용하여 디렉토리를 변경하고 와일드 카드 파일 패턴을 사용할 수 있습니까?

여기 내가하려는 일이 있습니다.

tar -cf example.tar -C /path/to/file *.xml

디렉토리 (-C)를 변경하지 않으면 작동하지만 tar 파일에서 절대 경로를 피하려고합니다.

tar -cf example.tar /path/to/file/*.xml

내가 시도한 다른 시도 중 일부는 다음과 같습니다.

tar -cf example.tar -C /path/to/file *.xml
tar -cf example.tar -C /path/to/file/ *.xml
tar -cf example.tar -C /path/to/file/ ./*.xml
tar -cf example.tar -C /path/to/file "*.xml"

그리고 이것은 내가 얻는 오류입니다.

tar: *.xml: Cannot stat: No such file or directory

find, xargs 등을 사용 하여이 작업을 수행 할 수있는 다른 방법이 있다는 것을 알고 있지만 tar 명령 만으로이 작업을 수행하려고했습니다.

어떤 아이디어?

답변:


18

문제는 * .xml이 tar가 아니라 쉘에 의해 해석된다는 것입니다. 따라서 찾은 xml 파일 (있는 경우)은 tar 명령을 실행 한 디렉토리에 있습니다.

원하는 파일을 선택한 다음 tar로 설정하려면 다단계 작업 (파이프가 포함될 수 있음)을 사용해야합니다.

가장 쉬운 방법은 cd파일이있는 디렉토리로 이동하는 것입니다.

$ (cd /path/to/file && tar -cf /path/to/example.tar *.xml)

작동해야합니다.

대괄호는 명령을 그룹화하므로 완료되면 여전히 원래 디렉토리에있게됩니다. && tar는 초기 cd가 성공한 경우에만 실행 됨을 의미합니다 .


9

당신의 시도 중 하나에서 :

tar -cf example.tar -C /path/to/file "*.xml"

* 문자는 실제로 tar로 전달됩니다. 그러나 문제는 tar가 아카이브 멤버 이름의 와일드 카드 일치 만 지원한다는 것입니다. 따라서 아카이브에서 멤버를 추출하거나 나열 할 때 와일드 카드를 사용할 수 있지만 아카이브를 작성할 때는 와일드 카드를 사용할 수 없습니다.

그러한 상황에서 나는 종종 (당신이 이미 언급 한 것처럼) 찾기를 의지합니다. GNU find가 있다면 -printf 옵션을 사용하여 상대 경로 만 인쇄하는 멋진 옵션이 있습니다.

find '/path/to/file' -maxdepth 1 -name '*.xml' -printf '%P\0' \
| tar --null -C '/path/to/file' --files-from=- -cf 'example.tar'
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.