我想在这样的 ftp 目录上递归地使用 wget:
ftp://ftp.ensembl.org/pub/current_fasta/
其中包含另外 2 个目录级别,第一个目录级别为物种名称,另一个目录级别为 name dna
,如下所示:ftp :
//ftp.ensembl.org/pub/current_fasta/species_name/dna/
例如,其中之一具有物种名称homo_sapiens
:
ftp://ftp.ensembl.org/pub/current_fasta/homo_sapiens/dna/
在每个./dna/
目录中,我只想下载名称包含单词的文件toplevel
而不是包含单词的文件_rm.toplevel
。
最后,我想要一个 wget 递归命令,它可以从这些目录下载所有这些文件,每个文件都作为一个名称为 的输出文件species_name.fa.gz
,其中species_name
是父目录的名称,就在dna
.
有任何想法吗?
您可以告诉 wget 根据通配符模式包含或排除文件和目录。未经测试:
wget -R \
-X '/*/?*dna,/*/pep' \
-A '*toplevel*' -R '*_rm.toplevel*' \
ftp://ftp.ensembl.org/pub/current_fasta/
Run Code Online (Sandbox Code Playgroud)
对于 FTP,wget 不是复杂检索的最佳工具。Wget 知道如何跟踪网页中的链接,但这与 FTP 无关。我建议将 FTP 站点安装为带有AVFS、CurlFtpFS或其他一些FUSE文件系统的目录,并使用cp
或rsync
. 使用 AVFS:
mountavfs
ls ~/.avfs/\#ftp:ftp.ensembl.org/pub/current_fasta/homo_sapiens
Run Code Online (Sandbox Code Playgroud)
使用 CurlFtpFS:
mkdir ~/current_fasta
curlftpfs ftp://ftp.ensembl.org/pub/current_fasta/ ~/current_fasta
ls ~/current_fasta/homo_sapiens
Run Code Online (Sandbox Code Playgroud)
要在任何 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
Run Code Online (Sandbox Code Playgroud)
或者在 zsh 中:
autoload zmv
zmv -C '~/.avfs/\#ftp:ftp.ensembl.org/pub/current_fasta/(*)/dna/*toplevel*~*_rm.toplevel*' '$1.fa.gz'
Run Code Online (Sandbox Code Playgroud)
如果你可以使用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
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
7868 次 |
最近记录: |