wgetは正規表現を渡したファイルでのみ繰り返されます。

wgetは正規表現を渡したファイルでのみ繰り返されます。

次のようにftpディレクトリでwgetを再帰的に使用したいと思います。

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

これには別の2つのディレクトリレベルが含まれています。最初のディレクトリには種名が含まれ、2番目のディレクトリにはdna次のように名前が含まれています。 ftp://ftp.ensembl.org/pub/current_fasta/species_name/dna/

たとえば、そのうちの1つに種名がありますhomo_sapiens

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

./dna/ディレクトリから、名前に単語を含むファイルのみをダウンロードしたいとし、単語を含むtoplevelファイルをダウンロードしたくありません_rm.toplevel

species_name.fa.gz最後に、wget再帰コマンドを使用して、これらのディレクトリ内のすべてのファイルをそれぞれwhere is species_namethe name of the parentディレクトリの直前にある出力ファイルにダウンロードしたいと思いますdna

どんなアイデアがありますか?

答え1

ワイルドカードパターンに基づいてファイルとディレクトリを含めるか除外するようにwgetに指示できます。テストされていません:

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

FTPの場合、wgetは複雑な検索に最適なツールではありません。 WgetはWebページのリンクをたどる方法を知っていますが、これはFTPとは何の関係もありません。 FTPサイトをディレクトリにマウントすることをお勧めしますAVFSカルフトププスまたは他のものヒューズファイルシステムと使用cpまたはrsyncAVFSの使用:

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

CurlFtpFSの使用:

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

シェルからファイルをコピーするには:

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

またはzshから:

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

答え2

利用可能な場合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

関連情報