답변1
GNUtar(Linux에서 일반적임)가 있는 경우 이 --transform
옵션을 사용할 수 있습니다.
예를 들어 현재 명령을 사용하면 다음과 같은 디렉터리가 있음을 확인할 수 있습니다.
$ find . -name '*.c' | xargs tar -rf allcfiles.tar
$ tar tf allcfiles.tar
./b.c
./d/e.c
./a.c
다음을 변환하여 이를 방지할 수 있습니다.
$ find . -name '*.c' | xargs tar --transform='s!.*/!!' -rf allcfiles.tar
$ tar tf allcfiles.tar
b.c
e.c
a.c
안에 있는 표현은 --transform
간단한 sed
표현입니다. 이는 모든 디렉터리 구성 요소를 제거하는 것뿐입니다.
답변2
find
구현에서 이 옵션을 지원하는 경우 다음과 같이 디렉터리 없이 파일을 삭제할 -execdir
수 있습니다 .tar
find . -name '*.c' -type f -execdir tar rf $PWD/mytar.tar {} +
tar 파일의 경로가 절대 경로인지 확인하세요.
답변3
POSIX 호환 명령만 사용하여 이를 수행하는 방법은 다음과 같습니다.
find . -name '*.c' | pax -w -s ',.*/,,' > allcfiles.tar
를 사용하는 것을 좋아한다면 tar rf archive ...
오른쪽부터 시작해야 합니다.비어 있는tar
리얼 모드에서는 아카이브가 생성되지 않으므로 처음부터 아카이브합니다 replace
. 이렇게 하려면 먼저 다음 명령을 실행하여 빈 TAR 아카이브를 생성할 수 있습니다.
printf "\000"| dd ibs=10k conv=sync > allcfiles.tar
그런데 저는 이 명령을 선호합니다:
star cf allcfiles.tar -s ',*/,,' -find . -name '*.c'
이는 해당 데이터가 아카이브의 파일 메타데이터를 설정하는 데 사용되므로 파일 star
당 한 번만 libfind
호출하면 되기 때문에 가장 빠른 방법이기 때문입니다 .stat()
stat
libfind
star