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