나는 다른 나무 종의 현상 데이터를 가지고 있지만 더 큰 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 표준을 완전히 준수하는 솔루션을 만드는 것은 불가능합니다.
다행히 gzip
A는 사실상의 표준. 최악의 경우 위의 코드는 (또는 ) gzip
이전에 실행되어야합니다 .tar
pax
답변
다음과 같은 것 :
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
하십시오.
모험심을 느낀다면, 하나의 라이너로 만들 수도 있습니다.