하위 디렉터리( 등 ) /Landsat_Data/
가 포함된 디렉터리가 있습니다 . 각 하위 디렉터리에는 파일(예: 등)이 포함되어 있으며 각 파일에는 다음과 같은 tif 또는 xml 파일이 포함되어 있습니다.Landsat_Data/Site1
Landsat_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.gz
LE70930862008092-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