태그 보관물: command-line

command-line

다른 하위 디렉토리에서 .tar.gz 파일 추출 이름은 tar 파일과 동일해야합니다. 나는 모두를 추출

나는 다른 나무 종의 현상 데이터를 가지고 있지만 더 큰 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

등등…



답변

귀하의 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


답변

다음과 같은 것 :

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하십시오.

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


답변