패턴이 "/"로 끝나는 경우 GNU tar의 "변환" 옵션이 일관되지 않게 동작합니다.

패턴이 "/"로 끝나는 경우 GNU tar의 "변환" 옵션이 일관되지 않게 동작합니다.

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
    ...
    

/그래서 뒤쫓는 것이 실제로 문제인 것 같습니다 . 이것은 기능입니까, 버그입니까, 아니면 이 옵션의 범위/구문을 오해하고 있는 것입니까? 버전은 tarGNU 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대체 텍스트의 역참조는 /디렉토리 내의 파일 경로 이름을 변환할 때 생략되지 않도록 보장합니다.

관련 정보