경로 없이 모든 파일을 압축하는 방법

경로 없이 모든 파일을 압축하는 방법

현재 디렉터리와 하위 디렉터리에서 모든 .c 파일을 찾아 압축하고 싶습니다. 이를 달성하기 위해 다음 방법을 사용해 보았지만 파일의 압축을 풀면 파일이 다른 폴더에 있습니다. 파일을 압축할 때 디렉터리를 포함하고 싶지 않습니다.

스크립트는 다른 모든 파일을 제외해야 하며 이러한 .c 파일의 디렉터리 구조를 유지해서는 안 됩니다.

find . -name '*.c' | xargs tar -rf allcfiles.tar 

여기에 이미지 설명을 입력하세요.

.

답변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()statlibfindstar

관련 정보