지정된 파일만 압축하고 싶습니다. 나는 시도했다:
$ 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
-C
tar(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 tar
1.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