
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
답변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로 끝나는 이름을 읽도록 지시합니다. 일반 종료 출력 대신find
null 종료( ) 출력을 생성하도록 요청했다는 점을 기억하세요 . 이는 가능한 모든 파일 이름을 공백이나 기타 특수 문자로 덮기 위한 것입니다.\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
지시합니다 . 또한 ( 디스크의 디스크 에서 읽는 것이 아니라 직접 파이프로 연결됨) 이라고 말합니다 . 동일 .tar
FILE
\n
FILE
stdin
find
tar
FILE
-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 -