Linux에서 초기 폴더 내용이 포함된 하위 폴더 압축 풀기

Linux에서 초기 폴더 내용이 포함된 하위 폴더 압축 풀기

하위 디렉터리( 등 ) /Landsat_Data/가 포함된 디렉터리가 있습니다 . 각 하위 디렉터리에는 파일(예: 등)이 포함되어 있으며 각 파일에는 다음과 같은 tif 또는 xml 파일이 포함되어 있습니다.Landsat_Data/Site1Landsat_Data/Site2.tar.gz/Landsat_Data/Site2/LE70930862008092-SC20160107074735.tar.gz.tar.gz

-rw-r--r-- espa/ie  29952 2016-01-07 14:57 LT50930861991021ASA00_sr_snow_qa.tif 

내가 원하는 것은 각 tar 파일을 자체 하위 디렉터리(예 Landsat_Data/Site2/LE70930862008092-SC20160107074735/: )에 추출하는 것입니다.

지금까지 Landsat_Data 디렉터리에서 다음 명령줄을 사용하고 있습니다.

find . -type f -name "*.tar.gz" -execdir tar -xvzf {} \;

그러나 이 명령은 모든 tif 및 xml 파일을 각 하위 디렉터리(예: )로 추출하는 반면, 저는 압축을 풀어 모든 tif 및 xml 파일이 포함된 tif 및 xml 파일 이라는 하위 하위 디렉터리를 갖고 Landsat_Data/Site2싶습니다 . 내가 원하는 것을 어떻게 달성할 수 있는지 아시나요?LE70930862008092-SC20160107074735.tar.gzLE70930862008092-SC20160107074735

답변1

노력하다

find . -type f -name "*.tar.gz" -execdir tar -xvzf {} \;

~에 따르면man find

-execdir 명령;

-execdir 명령{} +

-exec와 비슷하지만 지정된 명령은 일반적으로 검색을 시작한 디렉터리가 아닌 일치하는 파일이 포함된 하위 디렉터리에서 실행됩니다.

답변2

방법은 다음과 같습니다(bash를 사용한다고 가정).

$ shopt -s globstar   
$ for tar in /Landsat_Data/**/*.tar.gz; do 
   tar xvzf "$tar" --one-top-level="$(dirname "$tar")"/"$(basename "$tar" .tar.gz)"
  done

globstar옵션은 **0개 이상의 파일과 디렉터리를 반복적으로 일치시키므로 /Landsat_Data/**/*.tar.gz일치가 이루어집니다 *tar.gz. /Landsat_Data/명령은 dirname입력한 디렉터리 이름과 basename사용자가 지정한 확장자를 가진 이름만 인쇄합니다( tar.gz여기서는 삭제됨). 예를 들면 다음과 같습니다.

$ dirname /Landsat_Data/Site2/LE70930862008092-SC20160107074735.tar.gz
/Landsat_Data/Site2
$ basename /Landsat_Data/Site2/LE70930862008092-SC20160107074735.tar.gz .tar.gz
LE70930862008092-SC20160107074735

설명은 --one-top-level다음과 같습니다 man tar.

   --one-top-level[=DIR]
          Extract all files into DIR, or, if used without argument, into a
          subdirectory  named by the base name of the archive (minus stan‐
          dard compression suffixes recognizable by --auto-compress).

종합해보면 이는 귀하의 요구 사항을 충족시킬 것입니다.


해당 옵션이 없으면 tar수동으로 수행할 수 있습니다.

$ shopt -s globstar   
$ for tar in /Landsat_Data/**/*.tar.gz; do 
    newdir="$(dirname "$tar")"/"$(basename "$tar" .tar.gz)"
    mkdir "$newdir"
    tar xvzf "$tar" -C "$newdir"
  done 

관련 정보