다른 하위 디렉토리에서 .tar.gz 파일 추출


0

나는 다른 나무 종의 현상 데이터를 가지고 있지만 더 큰 Treegroup에 의해 저장됩니다.

출력 find . -name *.tar.gz은 다음과 같습니다.

./Tilia/PEP725_DE_129_070.tar.gz
./Tilia/PEP725_DE_129_071.tar.gz
./Fagus/PEP725_DE_108_010.tar.gz
./Acer/PEP725_DE_115_000.tar.gz
./Acer/PEP725_DE_115_030.tar.gz
./Betula/PEP725_DE_106_020.tar.gz

하위 디렉토리의 모든 파일을 추출하고 출력 디렉토리의 이름은 tar 파일과 동일해야합니다.

나는 모두를 추출 할 수 find . -name *.tar.gz -execdir tar -xvzf "{}" \;있지만 압축 파일 뒤에 디렉토리 이름을 만들지 않습니다.

어떻게해야합니까? -C디렉토리가 이미 존재해야합니다 ...

결국 나는 갖고 싶다

Tilia/EP725_DE_129_070/content_of_PEP725_DE_129_070.tar.gz

등등...


참고 : 올바르게 인용하십시오 -name "*.tar.gz". find와일드 카드를 사용할 때 비교 유틸리티가 모든 파일을 출력하지는 않습니다 . 몇 번 도망 칠 수도 있지만 결국에는 당신을 때릴 것입니다.
Kamil Maciorowski

답변:


0

귀하의 tar지원 --one-top-level옵션 인 경우 :

find . -name "*.tar.gz" -execdir tar --one-top-level -xvzf {} \;

보낸 사람 man 1 tar:

--one-top-level[=DIR]

모든 파일을 DIR으로 또는 인수없이 사용하는 경우 아카이브의 기본 이름으로 이름이 지정된 서브 디렉토리 (로 식별 할 수있는 표준 압축 접미어 빼기) 로 추출하십시오 --auto-compress.

참고 : {}인용 될 수도 있고 인용되지 않을 수도 있지만 다음과 같은 실수를 피하기 위해 인용 *.tar.gz 해야 합니다 : find와일드 카드를 사용할 때 유틸리티가 모든 파일을 출력하지는 않습니다 .


당신의 옵션을 tar지원하지 않는 것이 아주 좋은 생각이라면, 먼저 각각의 디렉토리를 만들어야합니다. 그러나이 명령은 한 단계 더 나아가서 사용하지도 않습니다 .--one-top-level-C-C

find . -type f -name "*.tar.gz" -execdir sh -c '
   dirn="${1%.tar.gz}"         # desired directory name
   mkdir -- "$dirn"            # creating a directory
   cd -- "$dirn" &&
   tar -xvzf ../"$1"           # extracting to it
' find-sh {} \;

POSIX 이외의 유일한 구성 요소는 바로 tar그 자체입니다. tar입니다 만 레거시 도구로 인식 gzip을 지원하지. POSIX (2001 년 이후)에서는 gzip을 지원하지 않는 프로그램 tar이 이에 해당 pax합니다. 내가 아는 gzip한 POSIX 에는 (또는 이에 상응하는) 것도 없기 때문에 공식 POSIX 표준을 완전히 준수하는 솔루션을 만드는 것은 불가능합니다.

다행히 gzipA는 사실상의 표준. 최악의 경우 위의 코드는 (또는 ) gzip이전에 실행되어야합니다 .tarpax


고마워요 POSIX 무엇을 의미합니까?
m4D_guY

@ m4D_guY 휴대용 운영 체제 인터페이스 . POSIX를 완전히 준수하는 솔루션은 다양한 시스템에서 작동합니다. 일반적으로 "대형"Linux에서만 지원되는 많은 도구 (또는 옵션)가 있습니다. 사용할 수 있다면 좋습니다! 그러나 임베디드 "최소"Unix 또는 Mac (툴이 Linux와 다른 툴)에서 작업하는 경우 POSIX를 넘어서는 솔루션은 생명의 은인이 될 수 있습니다.
Kamil Maciorowski

나는 이것이 어떻게 작동하는지 잘 모릅니다 솔직히 말해서 ... 난 항상 단지 위쪽 버튼을 클릭하지 버튼이 곳은, 링크가 완전히 미세한 차이입니다 "확인"
m4D_guY

@ m4D_guY 그럼 우리 투어 를 해주세요 . 투표하려면 15 개의 평판이 필요합니다. 귀하의 질문에 대한 답변을 수락하는 데 대한 제한은 없습니다. 다른 질문에 대한 좋은 대답을 얻은 경우 (수퍼 유저 일 필요는 없으며 스택 오버플로 일 수 있습니까?) 수락하는 것도 고려하십시오.
Kamil Maciorowski

0

다음과 같은 것 :

for f in $(find . -name *.tar.gz); 
do 
    cd $(dirname $d)       # to ./Tilia/
    d=$(basename $f .tar.gz)  
    mkdir $d               # ./Tilia/PEP725_DE_129_070
    cd $d                  # To ./Tilia/PEP725_DE_129_070
    tar -xvzf ../$d.tar.gz # extracting ./Tilia/PEP725_DE_129_070.tar.gz in ./Tilia/PEP725_DE_129_070
    cd ../..               # back to top
done 

테스트를 거치지 않은 상태에서 사용하십시오.

위의 파일과 파일로 복사 source하십시오.

모험심을 느낀다면, 하나의 라이너로 만들 수도 있습니다.


야생 체리 (또는 공간을 가진 또 다른 이름은) ... 나올 때까지
카밀 Maciorowski
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.