tar
경로 요소를 변환하는 옵션을 사용할 때 GNU의 다음과 같은 이상한 동작에 직면했습니다 --transform
. 전체 하위 디렉토리를 시도 tar
하고 경로를 해당 디렉토리로 변환하려고 하면 변환은 다음과 같습니다.아니요변환 모드가 명시적으로 포함되면 디렉터리 자체뿐만 아니라 해당 콘텐츠에도 적용됩니다 /
.
재현하려면:
- 더미 콘텐츠가 포함된 디렉터리를 만듭니다
test-dir
.$ mkdir test-dir $ touch test-dir/test{1..50}.txt
tar
디렉터리 이름은test-dir/
다음 으로 바뀌고 검사를 위해 변환된 이름을 인쇄하도록transformed-dir/
지시됩니다 .tar
$ tar --transform="s,^test-dir/,transformed-dir/," --show-transformed-names -cvf test.tar test-dir test-dir/ transformed-dir/test25.txt transformed-dir/test29.txt transformed-dir/test47.txt ...
보시다시피 디렉토리 자체는아니요이름 변경은 디렉터리의 모든 파일에 적용되지만 이름은 올바르게 변경됩니다.
- 비교를 위해 동일한 변환이 사용되지만아니요후행
/
:$ tar --transform="s,^test-dir,transformed-dir," --show-transformed-names -cvf test2.tar test-dir transformed-dir/ transformed-dir/test25.txt transformed-dir/test29.txt transformed-dir/test47.txt ...
이제 디렉토리 자체예이름을 올바르게 바꾸십시오.
앵커가 생략되면 동작은 변경되지 않으며 ^
압축할 디렉터리가 명령줄에 지정되어 있는지 여부와 관계가 없습니다./
/
디렉토리의 경우 지정할 때 문제가 있는지 궁금합니다.모두파일 이름은 바뀔 수 있습니다. 그러나 전체 파일의 이름을 바꾸는 변환을 지정하면 정상적으로 작동합니다.$ tar --transform="s,^test-dir/test29.txt,transformed-dir/file.txt," --show-transformed-names -cvf test3.tar test-dir test-dir/ test-dir/test25.txt transformed-dir/file.txt test-dir/test47.txt ...
/
그래서 뒤쫓는 것이 실제로 문제인 것 같습니다 . 이것은 기능입니까, 버그입니까, 아니면 이 옵션의 범위/구문을 오해하고 있는 것입니까? 버전은 tar
GNU tar 1.28입니다.
답변1
@muru와 @UncleBilly의 의견이 지적했듯이 여기서 문제는 GNU 오해와 불행한 결과가 혼합된 것일 수 있습니다 tar
.
- "verbose" 모드(GNU)에서 실행하면
-v
파일이 아닌 디렉터리를 참조하는 모든 항목에tar
후행 문자열이 추가 됩니다./
- 그러나 이것은
/
확실히실제 디렉토리 이름의 일부가 아닙니다.파일 시스템 데이터에 저장됩니다. - 변환은 디렉토리 항목의 "실제" 이름에서 작동하는 것으로 보입니다.확실히이름의 일부가 아니므로 패턴과 일치합니다.
some_name/
/
따라서 이 옵션의 일관되지 않은 동작은 --transform
다음으로 인해 발생합니다.인쇄디렉터리 이름과 실제(내부적으로 사용되는) 디렉터리 이름입니다.
@UncleBilly가 지적했듯이 지정된 이름과 정확히 일치하는 디렉터리만 이름을 바꾸도록 하려면 다음과 같은 변환 문을 사용하세요.
--transform='s,^path/to/dir\($\|/\),newname\1,'
path/to/dir
문자열 끝 앵커가 적용되는 디렉토리 $
와 해당 내용 path/to/dir/fileXXX.yyy
( dir
바로 다음에 오는 디렉토리 /
) 의 이름만 변경됩니다 . \1
대체 텍스트의 역참조는 /
디렉토리 내의 파일 경로 이름을 변환할 때 생략되지 않도록 보장합니다.