wget recursivo apenas para arquivos que passam um regexp

6

Eu gostaria de usar o wget recursivamente em um diretório de ftp como este:

ftp://ftp.ensembl.org/pub/current_fasta/

Que contém outros dois níveis de diretório, o primeiro com o nome da espécie e um dentro com o nome dna , assim: ftp://ftp.ensembl.org/pub/current_fasta/species_name/dna/

Por exemplo, um deles tem o nome da espécie homo_sapiens :

ftp://ftp.ensembl.org/pub/current_fasta/homo_sapiens/dna/

Dentro de cada diretório ./dna/ , eu gostaria de baixar apenas o arquivo com o nome contendo a palavra toplevel , mas não aquele contendo a palavra _rm.toplevel .

Por fim, gostaria que um comando recursivo wget baixasse todos aqueles desses diretórios, cada um como um arquivo de saída com o nome species_name.fa.gz , em que species_name é o nome do diretório pai, logo antes de dna .

Alguma idéia?

    
por 719016 29.07.2011 / 11:21

2 respostas

3

Se você puder usar lftp :

echo 'mirror --no-empty-dirs -I *toplevel* -X *_rm.toplevel* . .' | 
lftp ftp://ftp.ensembl.org/pub/current_fasta/
for folder in *; do
  mv $folder/dna/*toplevel* $folder.fa.gz
  rm -r "$folder"
done
    
por 29.07.2011 / 12:26
8

Você pode dizer ao wget para incluir ou excluir arquivos e diretórios com base em padrões de caractere curinga. Não testado:

wget -R \
  -X '/*/?*dna,/*/pep' \
  -A '*toplevel*' -R '*_rm.toplevel*' \
  ftp://ftp.ensembl.org/pub/current_fasta/

Para FTP, o wget não é a melhor ferramenta para recuperação complexa. O Wget sabe como seguir links em uma página da web, mas isso não é relevante para o FTP. Recomendo montar o site FTP como um diretório com AVFS , CurlFtpFS ou algum outro sistema de arquivos FUSE e usando cp ou rsync . Com o AVFS:

mountavfs
ls ~/.avfs/\#ftp:ftp.ensembl.org/pub/current_fasta/homo_sapiens

Com o CurlFtpFS:

mkdir ~/current_fasta
curlftpfs ftp://ftp.ensembl.org/pub/current_fasta/ ~/current_fasta
ls ~/current_fasta/homo_sapiens

Para copiar os arquivos em qualquer shell:

for x in ~/.avfs/\#ftp:ftp.ensembl.org/pub/current_fasta/*/dna/*toplevel*; do
  case $x in *_rm.toplevel*) continue;; esac
  species=${x%/dna/*}; species=${species##*/}
  cp -p "$x" "$species.fa.gz"
done

Ou em zsh:

autoload zmv
zmv -C '~/.avfs/\#ftp:ftp.ensembl.org/pub/current_fasta/(*)/dna/*toplevel*~*_rm.toplevel*' '$1.fa.gz'
    
por 29.07.2011 / 14:01

Tags