-C를 통해 dir로 변경했는데도 tar가 절대 경로를 사용하는 이유는 무엇입니까?

-C를 통해 dir로 변경했는데도 tar가 절대 경로를 사용하는 이유는 무엇입니까?

이것이 있다:

$ls $des/bin
a.c           analysis.hpp  classify.hpp  main.cpp   split.hpp
a.cpp         a.out         grade.cpp     main.out   student.cpp
analysis.cpp  classify.cpp  grade.hpp     split.cpp  student.hpp
$ for i in $des/bin/*{hpp,cpp}; do echo $i; done | tar czvf files.tar.gz -C $des/bin -T -

/home/user/Desktop/bin/analysis.hpp
/home/user/Desktop/bin/classify.hpp
/home/user/Desktop/bin/grade.hpp
/home/user/Desktop/bin/split.hpp
/home/user/Desktop/bin/student.hpp
/home/user/Desktop/bin/a.cpp
/home/user/Desktop/bin/analysis.cpp
/home/user/Desktop/bin/classify.cpp
/home/user/Desktop/bin/grade.cpp
/home/user/Desktop/bin/main.cpp
/home/user/Desktop/bin/split.cpp
/home/user/Desktop/bin/student.cpp

지금 -> 그럼에도 불구하고 나는변경됨dir 에는 $des/bin여전히 루트에서 시작하는 절대 경로가 제공되지만 제공되어야 합니다.비교적현재 디렉터리(뒷면 $des/bin) -C에서 시작하는 경로, 이유는 무엇입니까?

답변1

$desContains 이므로 /home/user/Desktop전달하려는 파일 목록은 다음 tar -T -과 같습니다.

/home/user/Desktop/bin/analysis.hpp
/home/user/Desktop/bin/classify.hpp
/home/user/Desktop/bin/grade.hpp
[...]

목록은 다음과 같아야 합니다.

analysis.hpp
classify.hpp
grade.hpp
[...]

이것이 아카이브에 저장하려는 경로인 경우.

일반적으로 다음을 수행합니다.

(
  cd -P -- "$des/bin" &&
    printf '%s\0' *.[hc]pp |
      tar --null -T - -zcvf -
) > file.tar.gz

(GNU tar또는 호환 가정).

파일 목록이 충분히 작으면 필요하지 않습니다 printf. 다음과 같이 할 수 있습니다.

(
  cd -P -- "$des/bin" &&
    tar -czvf - -- *.[hc]pp
) > file.tar.gz

또는 가장 짧은 형식으로 요약하면 다음과 같습니다.

(cd -P -- "$des/bin"&&tar czvf - -- *.[hc]pp)>file.tar.gz

파일 수가 매우 많으면 *.[hc]ppcmdline+environ 시스템 호출이 사용할 수 있는 최대 크기를 초과할 수 있습니다 execve(). 내장 함수는 시스템 호출을 통해 실행되지 않으므로 이 제한 사항의 영향을 받지 않으므로 printf셸에서 printf내장 함수를 사용하면 bash이 문제를 해결할 수 있습니다.execve()

답변2

GNU tar 전용

tar --transform "s,.*/\(.*\),$des/bin/\1," -czf ~/files.tar.gz "$des"/bin/*.[ch]pp

당신이 찾고 있는 것일 수 있습니다. (첫 번째 것은 $des/bin/당신이 좋아하는 것으로 대체될 수 있으며 \1파일 이름을 나타냅니다.)

tar --transform 's,.*/\(.*\),\1,' -czf ~/files.tar.gz "$des"/bin/*.[ch]pp

관련 정보