![-C를 통해 dir로 변경했는데도 tar가 절대 경로를 사용하는 이유는 무엇입니까?](https://linux55.com/image/177737/-C%EB%A5%BC%20%ED%86%B5%ED%95%B4%20dir%EB%A1%9C%20%EB%B3%80%EA%B2%BD%ED%96%88%EB%8A%94%EB%8D%B0%EB%8F%84%20tar%EA%B0%80%20%EC%A0%88%EB%8C%80%20%EA%B2%BD%EB%A1%9C%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94%20%EC%9D%B4%EC%9C%A0%EB%8A%94%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
이것이 있다:
$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
$des
Contains 이므로 /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]pp
cmdline+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