디렉토리 내용에서 .tgz를 생성하고 싶습니다. 또한 ./
tar 내용에서 선행 ""를 제거하고 싶습니다 .
이것이 내가 하는 방법이다:
cd /path/to/files/ && find . -type f | cut -c 3- | xargs czf /path/to/tgz/myTgz.tgz
나최근에 배운 것cmdline 인수 목록이 너무 길면 여러 번 호출될 수 있으므로 를 사용하는 것이 xargs
이를 달성하는 가장 좋은 방법은 아닐 수 xargs
있으며 표준 입력에서 입력 파일 목록을 읽는 기능을 활용하는 것이 좋습니다. 결국엔 알게 됐어tar
tar
이 기사이를 수행하는 방법에 대해. 그런데 이 추천을 봤는데..
cd /path/to/files/ && find . -type f | cut -c 3- | tar czf foo.tgz -T -
...휴대하기 불편할 것 같아요. 내 개발 PC에서는 잘 실행되지만 busybox 대상에서는 동일한 명령을 실행할 때 다음 오류가 발생합니다.
tar: can't open '-': No such file or directory
그래서 나의질문tar
: 표준 입력(명령줄 인수가 아닌)에서 제공하여 생성된 파일을 호출하는 진정한 이식성/전역적 방법이 있습니까 ?.tgz
( // tar
와 같은 대안을 설치할 수 있는 옵션이 없습니다.)gnutar
bsdtar
(두 번째 질문: " -T -
" 매개변수가 tar
"를 의미하는 이유는 무엇입니까?다음에서 파일 읽기stdin
tar
매뉴얼 페이지 에서는 " -T
"의 의미만 찾을 수 있습니다.
FILE에서 추출하거나 생성할 이름 가져오기
-
...하지만 일반 " "에 대한 참조 는 표시되지 않습니다 .)
답변1
-
이는 파일 이름이 입력으로 필요할 때 표준 입력을 해석하고, 파일 이름이 출력으로 필요할 때 표준 출력을 해석하는 일반적인 규칙입니다 . 이는 일반적인 규칙이므로 GNU tar 매뉴얼 페이지의 짧은 도움말 요약에는 언급되어 있지 않습니다.완전한 매뉴얼(종종 현지에서 사용 가능 info tar
). 이것POSIX 명령줄 유틸리티 구문 가이드이 규칙은 포함되어 있으므로 상당히 광범위합니다(그러나 항상 프로그램 작성자의 선택입니다).
BusyBox 유틸리티는 이 규칙을 따릅니다. 하지만수동tar
이 옵션에 대한 지원 에 대한 언급은 없으며 -T
제가 게시한 컴퓨터 버전(Ubuntu의 경우 1.27.2)도 없습니다. "잘못된 옵션 - 'T'" 대신 ": 해당 파일이나 디렉터리가 없습니다"라는 오류가 나타나는 이유를 모르겠습니다. 인수 없이 옵션으로 해석한 다음 파일 이름으로 처리하는 것 tar
같습니다 . 이 경우 tar에는-T
-
파일 이름일부만이 아니라 아카이브에 넣어라콘텐츠파일에서 stdin/stdout 해석을 사용하는 것은 의미가 없습니다 -
.
BusyBox 유틸리티는 임베디드 시스템용으로 제작되었기 때문에 제한된 기능 세트를 지원하도록 설계되었으며 GNU 유틸리티의 고급 기능은 이러한 시스템에 적합하지 않습니다. 분명히 -T
BusyBox 디자이너는 이것이 유용한 기능이라고 생각하지 않았습니다.
BusyBox tar에는 표준 입력에서 파일 이름을 읽을 수 있는 방법이 없다고 생각합니다. 아카이브 디렉터리에 파일의 하위 집합이 필요하고 아카이브에 기호 링크가 필요하지 않은 경우 해결 방법은 임시 디렉터리에 기호 링크 포리스트를 만들고 이 임시 디렉터리를 보관하는 것입니다.
왜 그것을 사용하고 있는지는 명확하지 않습니다 find
. 현재 디렉토리에 있는 파일만 원하면 안 되겠습니까 tar czf /path/to/archive.tgz -- *
? 하위 디렉터리가 존재하고 해당 하위 디렉터리에 파일을 보관하고 디렉터리 자체는 보관하지 않으려는 경우(아마도 디렉터리 구조가 있어야 하지만 다른 권한을 사용하여 파일을 복원하려는 경우) 명령이 적합합니다. 이 경우 앞서는 것은 ./
아무런 해가되지 않습니다.
답변2
나는 이것이 어리석은 대답이고 아마도 당신에게 좋지 않을 수도 있다는 것을 알고 있지만, 만약 당신이 단지 ...
cd /path/to/files/ && find . -type f | cut -c 3- >/tmp/temp.txt
tar czf foo.tgz -T /tmp/temp.txt
답변3
-u/--update
이 옵션을 와 함께 사용할 수 있습니다 xargs
. 방금 시도하고 작동한다는 것을 증명했습니다. 다음을 tar
사용하여 파일 이름 매개변수를 하나씩 제공했습니다 xargs -n 1
.
find top_of_tree/ -type f | xargs -n 1 tar -uf archive.tar
물론 이것은 단지 개념 증명일 뿐입니다. 귀하의 경우, xargs
많은 수의 호출을 피하기 위해 인수 목록을 인수 길이 제한을 초과하지 않는 더 큰 부분으로 분할하는 것을 허용하는 것이 더 실용적일 수 있습니다 tar
.
find top_of_tree/ -type f | xargs tar -uf archive.tar
전제 조건은 tar
플랫폼의 모든 구현이 -u/--update
이러한 플래그 중 하나 이상을 지원한다는 것입니다.
편집: -u/--update
플래그를 사용하면 tar
아카이브를 생성하고 추가할 수 있습니다.
-c
불행하게도 압축된 아카이브(tgz, 해당 플래그로 생성됨)를 업데이트할 수 없다는 것을 방금 확인했습니다 . 그러나 어쨌든 먼저 압축되지 않은 아카이브를 만든 다음 결과를 압축할 수 있습니다.
tar
또한 하이픈("-" 문자)이 포함된 플래그를 사용해도 혼동하지 않을 것입니다. 두 가지 형식을 모두 허용합니다. 내 경우에는 당신 -uf
과 같습니다 uf
.
이 옵션에 관해서는 -
매뉴얼 페이지에 문서화되어 있지 않을 것입니다. tar
왜냐하면 이는 스트림과 명명된 파일을 처리하는 명령줄 도구에 대한 매우 일반적인 Unix 규칙이기 때문입니다.
-
일반적으로 필터에 대한 특수 인수이며 표준 입력 스트림을 파일로 명명합니다.
답변4
이 기사는 도움이 되었지만 다음은 특정 파일 시스템의 폴더 구조를 백업하고 tar가 stdin에서 해당 폴더 구조를 읽도록 하려는 실제 예입니다.
find /kelinda/ -type d | tar cvf /tmp/kelinda.folders.tar --no-recursion -T -
참고: /kelinda는 외장 하드 드라이브에 있는 파일 시스템일 뿐입니다.
따라서 find를 사용하여 원하는 목록을 찾아 tar로 파이프할 수 있습니다. "-T -"는 표준 입력(다른 게시물에서 언급했듯이)에서 입력 파일을 읽은 다음 tar가 원하지 않는 다른 파일을 백업하는 것을 방지하기 위해 "--no-recursion"을 추가했습니다.
즉, --no-recursion 옵션과 함께 find를 사용하면 파일 및/또는 폴더의 정확한 목록을 백업한 다음 "-T -" 옵션과 결합하여 다음을 읽을 수 있습니다. 표준 입력의 입력으로.