tar.gz 압축을 수행할 때 전체 경로를 어떻게 제거합니까?

tar.gz 압축을 수행할 때 전체 경로를 어떻게 제거합니까?

g이 명령을 사용하여 Java 코드에서 이름이 지정된 디렉터리를 보관합니다 .

tar czf /a/b/c.tar.gz /e/f/g

tar 파일이 c.tar.gz생성되면 전체 경로를 찾은 e/f/g다음 그 안에 있는 폴더의 모든 파일을 찾습니다 g. 하지만 g압축된 아카이브를 열 때 폴더 아래의 파일만 보고 싶습니다 . /e/f/.tar.gz 파일에서 폴더를 어떻게 제거합니까 ?

답변1

tar -czf /a/b/c.tar.gz -C /e/f/g .

-C옵션은 tar작업 디렉터리를 변경하므로 ..

보다:작업 디렉토리 변경 – GNU tar매뉴얼

답변2

이 질문은 오래 전의 질문이지만 상대 경로와 함께 특정 검색 기준으로 파일 및 폴더를 추가하는 것에 대한 답을 쉽게 찾을 수 없었습니다.

다음은 질문한 것보다 더 광범위한 주제를 다루고 있습니다. 그래서 저는 연구를 통해 생각해낸 해결책을 글로 쓰고 있습니다.

$input_dir변수가 관심 있는 디렉터리를 가리키고 모든 *.txt파일을 tar로 압축(gzip 사용)하려고 한다고 가정해 보겠습니다 ~/my_txt.tar.gz. tar(상대 경로)에 저장된 경로 없이 gzip으로 압축된 tarball을 만들려면 다음을 사용하십시오.

find "$input_dir" -maxdepth 1 -type f -name "*.txt" -printf "%P\0" | tar --null --create --remove-files --gzip --file="$HOME/my_txt.tar.gz" --directory="$input_dir" --files-from=-

그것을 분석해 봅시다:

  • "$input_dir": 시작점 디렉터리입니다. 원하는 대로 변경하세요.
  • maxdepth 1: 해당 디렉토리의 루트만 찾습니다. 전체 또는 다른 레벨을 검색하려면 이를 제거하거나 수정할 수 있습니다.
  • -type f: 파일만 검색
  • -name "*.txt": *.txt 기준과 일치
  • -printf "%P": 상대 경로를 출력합니다(man 페이지: "파일이 발견된 시작점 이름이 제거된 파일 이름").
  • -printf "%P\0": null은 상대 경로 출력을 종료합니다.
  • | tar: 출력을 다음 명령인 tar로 파이프합니다.
  • --null: 후속 --files-from옵션에 null로 끝나는 이름을 읽도록 지시합니다. 일반 종료 출력 대신 findnull 종료( ) 출력을 생성하도록 요청했다는 점을 기억하세요 . 이는 가능한 모든 파일 이름을 공백이나 기타 특수 문자로 덮기 위한 것입니다.\0\n
  • --create: tar 파일을 생성합니다. 동일 -c.
  • --remove-files: 파일이 타르볼에 추가된 후 파일을 제거하려면 이 옵션을 사용합니다. 떨어뜨려도 됩니다.
  • --gzip: tarball을 gzip으로 압축합니다. 동일 -z.
  • --file="$HOME/my_txt.tar.gz": 출력 gzip으로 압축된 tarball 파일입니다. 동일-f "$HOME/my_txt.tar.gz"
  • --directory="$input_dir": 이는 tar이제 이 디렉토리로 변경됨을 의미합니다. 이제 이 디렉터리에 전달된 파일 이름을 찾습니다(이 폴더에 대한 파일 이름의 상대 경로를 만들었다는 점을 기억하세요). 동일 -C "$input_dir".
  • --files-from=/dev/stdin: 일반적인 형태는 이다 --files-from=FILE. 옵션이 포함된 이 옵션은 의 이름을 줄 바꿈 ( ) 대신 ASCII NULL 문자로 구분하도록 --null지시합니다 . 또한 ( 디스크의 디스크 에서 읽는 것이 아니라 직접 파이프로 연결됨) 이라고 말합니다 . 동일 .tarFILE\nFILEstdinfindtarFILE-T -

위 중 일부는 하나의 캐릭터 옵션으로 변경 및 결합이 가능합니다.

find "$input_dir" -maxdepth 1 -type f -name "*.txt" -printf "%P\0" | tar --null --remove-files -czf "$HOME/my_txt.tar.gz" -C "$input_dir" -T -

-t또는 옵션을 사용하여 파일 목록을 확인할 수 있습니다 --list.

tar -tf "$HOME/my_txt.tar.gz"

이제 $output_dir 디렉토리(존재하는)에 파일을 추출하려면 다음을 사용하십시오.

tar -xvzf "$HOME/my_txt.tar.gz" -C "$output_dir"

v옵션은 장황하며 tarball 생성 중에 추가할 수도 있습니다.

답변3

slhck 답변은 원하는 파일을 필터링하는 것을 허용하지 않으며 전체 디렉터리를 포함하며 쉘 글로빙은 이 디렉터리 옵션에서 작동하지 않습니다(여기에 설명된 이 문제 참조:'디렉토리 변경' 옵션을 사용하여 tar globbing 작업을 수행하는 방법).

shaheen g 답변은 ​​훌륭하지만 문자열에서 null 바이트가 금지되어 있기 때문에 null 바이트로 인해 프로그래밍 언어에서 명령을 사용할 수 없습니다. 그래서 공백이 있는 파일 이름을 처리할 필요가 없을 때 널 바이트 없이 작동하도록 조정했습니다.여기.

tar -czf /a/b/c.tar.gz -C /e/f/g $(find /e/f/g -maxdepth 1 -type f -name "*.txt" -printf "%f\n")

또는

find /e/f/g -maxdepth 1 -type f -name "*.txt" -printf "%f\n" | tar -czf /a/b/c.tar.gz -C /e/f/g -T -

관련 정보