tar 명령과 함께 -C 옵션을 사용할 때 전역/와일드카드 문자를 어떻게 사용합니까?

tar 명령과 함께 -C 옵션을 사용할 때 전역/와일드카드 문자를 어떻게 사용합니까?

내 디렉토리 구조는 다음과 같습니다.

/home/workspace/build/

/home/workspace/js/jai.1.js
/home/workspace/js/jai.2.js
/home/workspace/js/jai.3.js
/home/workspace/js/jai.4.js

나는 원해요아스팔트모두JS접두사가 있는 파일자이/home/workspace/js/디렉토리 사이의 내용 /home/workspace/build/.

생성된 tar 파일의 이름은 다음과 같다고 가정합니다.보관소

그래서 보관소다음 파일이 포함되어야 합니다.

jai.1.js
jai.2.js
jai.3.js
jai.4.js

tar파일을 대상에 복사한 다음 압축하는 대신 명령을 사용하여 이를 달성하고 싶습니다 .

편집하다

destination디렉토리에서 압축하고 싶습니다 ./home/workspace/build/

답변1

(cd ../js && pax -w jai.*.js) | gzip > bundle.tar.gz

이 작업을 수행합니다(명령이 있는 경우 로 대체 pax -w). 요점은 서브쉘을 사용하여 /의 현재 디렉토리만 변경하는 것입니다.tar cf -tarpaxtar

일부 tar구현( tar이것은 매우 이식성이 없는 명령이므로 POSIX가 도입되었습니다 pax)에는 -C파일 컬렉션의 디렉터리를 변경할 수 있는 옵션이 있지만 파일 출력의 디렉터리는 변경할 수 없습니다. 또한 일반적으로 자체적으로 z호출 gzip하거나 내부적으로 gzip 압축을 구현하는 옵션도 지원합니다.

그러나 다음과 같은 것들은:

tar czf bundle.tar.gz -C ../js jai.*.js

jai.*.js현재 디렉토리를 변경하지 않고 쉘에 의해 확장되므로 작동하지 않습니다 . 이를 통해 zsh다음을 수행할 수 있습니다.

tar czf bundle.tar.gz -C ../js ../js/jai.*.js(:t)

수정자를 어디서 :t구할 수 있나요?꼬리glob에 의해 생성된 파일의 (기본 이름)입니다.

를 사용하면 pax다음 작업도 수행할 수 있습니다.

pax -'s|.*/||' -w -- ../js/jai.*.js | gzip > bundle.tar.gz

그러나 선행 경로 구성 요소를 제거하는 대체는 심볼릭 링크 대상에도 적용되며(일부 tar구현에는 이러한 파일을 번역해야 하는지 여부를 지정할 수 있는 유사한 옵션이 있음) jail.*.js이러한 파일 중 하나라도 Out이면 다른 결과가 속합니다. 타자하다목차더 많은 파일을 포함할 수 있습니다.

libarchive를 사용하면 bsdtar다음 작업도 수행할 수 있습니다.

bsdtar zcf bundle.tar.gz -C ../js --include=. --include='jai.*.js' .

GNU에는 by has 이 tar없으므로 다음과 같이 할 수 있습니다.--include--exclude

tar zcf bundle.tar.gz -C ../js --exclude='*[^s.]' \
                               --exclude='*?.' \
                               --exclude='*[^j]s' \
                               --exclude='*[^.]js' .

(이렇게 하면 항목이 추가되지만 .)

그리고 star:

star czf bundle.tar.gz -C ../js 'pat=jai.*.js' .

jai.foo/bar.js(그러나 디렉터리에 일치하지 않는 파일은 포함되지만 포함되지는 않습니다 )jail.*.js

star czf bundle.tar.gz -C ../js 'pat=jai.#[^/].js{%!/*}' .

(여기서 는 ERE와 #<expr>같고 ( 는 아무것도 아니며 OR입니다))는 와 동일한 작업을 수행 합니다 . 또한 전체 디렉터리 구조를 크롤링하여 최상위 파일만 선택합니다.<expr>*{%!/*}(/.*)?%!(cd ../js && tar czf - jai.*.js) > bundle.tar.gz

최신 버전의 경우 를 사용할 수도 있습니다 -find. 따라서 이에 상응하는 경우 (cd ...)불필요한 디렉토리로 크롤링하지 않지만 여전히 디렉토리의 모든 파일을 포함합니다 jai.*.js.

star czf bundle.tar.gz C=../js  -find . \
  \( \( -name '*.js' -o -path '*/*' -o -name . \) -o ! -prune \) ! -name .

가능성이 더 높지만 실제로 원하는 것은 다음과 같습니다.

star czf bundle.tar.gz C=../js \
  -find . -maxdepth 1 -name 'jai.*.js' -type f

그거 그냥 아카이브야jai.*.js 정기적인파일이며 최상위 수준에서만 zsh다음과 같은 작업도 수행할 수 있습니다.

(cd ../js && pax -w -- jai.*.js(.)) | gzip > bundle.tar.gz

( (.)가 되다글로벌 예선제한된정기적인문서).

답변2

여기서는 정규 표현식이 필요하지 않습니다. 다음과 같이 일반 쉘 별표를 사용할 수 있습니다.

tar cvzf /home/workspace/build/bundle.tar.gz /home/workspace/js/jai.*.js

디렉토리 구조를 유지하고 싶지 않다면 가장 쉬운 방법은 cd /home/workspace/js/다음과 같습니다.tar cvzf /home/workspace/build/bundle.tar.gz jai.*.js

관련 정보