내 디렉토리 구조는 다음과 같습니다.
/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 -
tar
pax
tar
일부 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