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オプションは、**ゼロ個以上のファイルとディレクトリを繰り返し一致させるため、/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 

関連情報