답변1
Pass zsh
, @
glob 한정자를 사용하여 glob 확장을 다음 유형의 파일로 제한 할 수 있습니다.심볼릭 링크:
tar -czf file.tar.gz -- *(@)
숨겨진 파일도 포함하려면 D
( D
다른 파일의 경우) 한정자를 추가하세요.
tar -czf file.tar.gz -- *(D@)
find
다른 쉘에서는 다음 유형의 파일을 찾는 데 사용할 수 있습니다.심볼릭 링크다음 주소로 전달하세요 tar
.
find . ! -name . -prune -type l -exec tar -zcf file.tar.gz {} +
그러나 zsh 접근 방식과 비교할 때 몇 가지 차이점에 유의하세요.
숨겨진 파일이 포함되어 있으며 다음이 필요합니다.
LC_ALL=C find . ! -name . -prune ! -name '.*' -type l -exec tar -zcf file.tar.gz {} +
확실하게 제거하십시오.
파일 목록이 정렬되지 않았습니다.
접두사는
./
아카이브 멤버에 추가됩니다(이것이 우리가 필요하지 않은 이유입니다--
).일치하는 파일이 많으면 여러 번
find
호출하게 될 수 있습니다tar
. 즉,file.tar.gz
마지막 실행의 파일만 포함됩니다. (이 경우 zsh 접근 방식을 사용하면 다음과 같은 결과가 나올 수 있습니다.매개변수 목록이 너무 깁니다.대신 오류).
find
, 및 moreutils sort
의 GNU 구현을 사용하면 tar
다음을 수행하여 이러한 문제를 해결할 수 있습니다.ifne
LC_ALL=C find . ! -name . -prune ! -name '.*' -type l -printf '%P\0' |
sort -z |
ifne tar -zcf file.tar.gz --null -T -
어디:
-printf '%P\0'
시작 디렉터리( )를 기준으로 파일 경로를 인쇄하는 데 사용합니다 ..
예를 들어 0이link
파일./link
경로에 나타날 수 없는 유일한 바이트 값이기 때문에 NUL로 구분됩니다.sort -z
이러한 NUL로 구분된 레코드는 zsh glob과 마찬가지로 로케일의 데이터 정렬에 따라 어휘적으로 정렬됩니다.tar
인수 크기에 대한 시스템의 제한을 피하기 위해 목록을 인수로 전달하는 대신 표준 입력의 파이프를 통해 목록을 전달합니다 .ifne
파일이 없는 경우를 처리해야 합니다. 이 경우 GNU 1.34는 파일이 없으면tar
최소한 0으로 채워진 거의 희박한 10KiB를 생성하는 것처럼 보입니다 .file.tar.gz
/tmp
그럼에도 불구하고 고정된 이름을 가진 파일은 보안 위험이 있으므로 전역적으로 쓰기 가능한 디렉터리에 생성되어서는 안 된다는 점을 명심하십시오 .
답변2
명령줄에서 사람들은 여러 명령을 결합하여 복잡한 작업을 해결합니다. 심볼릭 링크 이름에 공백이나 특수 문자가 없다는 것을 알고 있다면 간단히 다음 find
과 같이 사용할 수 있습니다.명령 대체:
tar -czf /tmp/test.tar.gz `find -maxdepth 1 -type l`
예를 들어 이름의 공백이나 세미콜론에는 적용되지 않습니다. 이 경우 간단한 해결책은 목록을 임시 파일에 쓰는 것입니다.
TMPLIST=`mktemp`
find -maxdepth 1 -type l -print0 > $TMPLIST
tar -czf /tmp/test.tar.gz --null --files-from $TMPLIST
rm $TMPLIST