Subpastas Untar com conteúdo da pasta inicial no linux

7

Eu tenho um diretório, /Landsat_Data/ , que contém subdiretórios ( Landsat_Data/Site1 , Landsat_Data/Site2 , etc.). Cada subdiretório contém .tar.gz arquivos (por exemplo, /Landsat_Data/Site2/LE70930862008092-SC20160107074735.tar.gz , etc.) e cada arquivo .tar.gz contém arquivos tif ou xml como thisL

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

O que eu quero fazer é descompactar cada arquivo tar em seu próprio subdiretório (por exemplo, Landsat_Data/Site2/LE70930862008092-SC20160107074735/ ).

Até o momento, estou usando esta linha de comando, sendo os diretórios Landsat_Data:

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

No entanto, esse comando extrai todos os arquivos tif e xml em cada subdiretório (por exemplo, Landsat_Data/Site2 ), enquanto eu só quero descompactar o LE70930862008092-SC20160107074735.tar.gz para ter um subdiretório chamado LE70930862008092-SC20160107074735 que contém todos os tif e arquivos xml. Alguma idéia de como eu posso conseguir o que eu quero?

    
por SimonB 12.10.2016 / 14:46

2 respostas

5

tente

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

de acordo com man find

-execdir command ;

-execdir command {} +

Like -exec, but the specified command is run from the subdirectory containing the matched file, which is not normally the directory in which you started find.

    
por 12.10.2016 / 14:58
2

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 
    
por 12.10.2016 / 16:31

Tags