Aqui está uma maneira (isso pressupõe que você esteja usando o 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
A opção globstar
faz com que **
correspondam a 0 ou mais arquivos e diretórios de forma recursiva, portanto, /Landsat_Data/**/*.tar.gz
corresponderá a todos os arquivos *tar.gz
em qualquer subdiretório de /Landsat_Data/
. O comando dirname
imprime o nome do diretório de sua entrada e o basename
apenas o nome com a extensão que você fornece (aqui tar.gz
removed. Portanto, por exemplo:
$ dirname /Landsat_Data/Site2/LE70930862008092-SC20160107074735.tar.gz
/Landsat_Data/Site2
$ basename /Landsat_Data/Site2/LE70930862008092-SC20160107074735.tar.gz .tar.gz
LE70930862008092-SC20160107074735
O --one-top-level
é explicado em 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).
Juntos, isso fará o que você quiser.
Se o seu tar
não tiver essa opção, você poderá fazer isso manualmente:
$ 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