와일드카드를 통해 지정된 파일만 압축하는 방법은 무엇입니까?

와일드카드를 통해 지정된 파일만 압축하는 방법은 무엇입니까?

지정된 파일만 압축하고 싶습니다. 나는 시도했다:

$ ls $des/bin
a.c           analysis.hpp  classify.hpp  main.cpp   split.hpp
a.cpp         a.out         grade.cpp     main.out   student.cpp
analysis.cpp  classify.cpp  grade.hpp     split.cpp  student.hpp
$ cd /
$ tar czf ~/files.tgz -C $des/bin '*.cpp' '*.hpp'

주다

tar: *.cpp: Cannot stat: No such file or directory
tar: *.hpp: Cannot stat: No such file or directory
tar: Exiting with failure status due to previous errors

하나도 --wildcards도움이 안 돼

$ tar czf ~/files.tgz -C $des/bin --wildcards '*.{c,h}pp' 
tar: *.{c,h}pp: Cannot stat: No such file or directory
tar: Exiting with failure status due to previous errors

-Ctar(via)에서 변경된 디렉토리에서 와일드카드를 사용하는 방법은 무엇입니까 ?

답변1

glob은 쉘에 의해 확장됩니다. 와일드카드는 tar(적어도 일부 tar구현에서는) 지원되지만 아카이브에서 추출하거나 나열할 파일을 필터링하는 경우에만 사용됩니다.

따라서 파일 목록은 셸에서 생성해야 하며, 아카이브에 저장해야 하는 파일 이름에 디렉터리 부분이 포함되어 있지 않은 경우 해당 디렉터리 부분 tar을 제거하거나(일부는 -s또는 --transform옵션이 있음) cd간단히 파일 목록을 생성하기 전에 디렉터리입니다.

출력 아카이브를 원래 작업 디렉터리에 유지하려면 다음과 같이 리디렉션을 사용하고 하위 셸에서만 디렉터리를 변경할 수 있습니다.

(cd -P -- "$des/bin" && tar -zcvf - -- *.[hc]pp) > files.tar.gz

또는 변경하기 전에 현재 작업 디렉터리를 기록할 수 있습니다.

(dir=$PWD; cd -P -- "$des/bin" && tar -zcvf "$dir/files.tar.fz" -- *.[hc]pp)

답변2

어때요?

$ tar czf ~/files.tgz -T <(\ls -1 $des/bin/*.{c,h}pp)

tar플래그 뒤의 파일 내용을 -T압축할 파일(한 줄)로 처리합니다. 이것은 GNU tar1.32에서 작동합니다.

<(cmd)이를 cmd표현하는 문법은 \ls -1 $des/bin/*.{c,h}pp다음과 같습니다.프로세스 교체( man bash자세한 내용은 참고자료를 참조하세요)

편집하다:tarball에서 파일 이름을 완전히 한정할 필요가 없다면(절대 경로 제외), cd명령을 실행하기 전에 원하는 디렉터리로 이동하세요 tar.

$ cd $des/bin; tar czf ~/files.tgz -T <(\ls -1 *.{c,h}pp)

관심 있는 디렉터리는 플래그를 사용하여 지정됩니다 -C.

$ tar czf ~/files.tgz -C $des/bin -T <(\ls -1 *.{c,h}pp)

작동하지 않습니다. 이 -C플래그는 순서를 구분하지만, 즉 모든 후속 플래그에 영향을 주지만 표시된 프로세스 대체에는 적용되지 않습니다.

답변3

맥OS 11

tar -C my_forder_with_files -czvf example.tar.gz  -T <(ls -1 my_forder_with_files | grep -E '(\.log|\.txt)$')

"example.tar.gz" 출력

a app.txt
a app 2.txt
a url.log
a urls 2.log

관련 정보