创建目录,从URL列表中下载文件并执行命令



我正在红帽Linux服务器上工作。我的最终目标是在多个fasta文件上运行CRB-BLAST,并从不同的目录中获得结果。

我的方法是使用wget下载fasta文件,然后运行CRB-BLAST。我有多个文件,并希望能够将它们每个下载到自己的目录(名称可能应该来自URL列表文件),然后运行CRB-BLAST。

示例url:

http://assemblies/Genomes/final_assemblies/10x_assemblies_v0.1/TC_3370_chr.v0.1.liftover.CDS.fasta.gz
http://assemblies/Genomes/final_assemblies/10x_assemblies_v0.1/TC_CB_chr.v0.1.liftover.CDS.fasta.gz
http://assemblies/Genomes/final_assemblies/10x_assemblies_v0.1/TC_13_chr.v0.1.liftover.CDS.fasta.gz
http://assemblies/Genomes/final_assemblies/10x_assemblies_v0.1/TC_37_chr.v0.1.liftover.CDS.fasta.gz
http://assemblies/Genomes/final_assemblies/10x_assemblies_v0.1/TC_123_chr.v0.1.liftover.CDS.fasta.gz
http://assemblies/Genomes/final_assemblies/10x_assemblies_v0.1/TC_195_chr.v0.1.liftover.CDS.fasta.gz
http://assemblies/Genomes/final_assemblies/10x_assemblies_v0.1/TC_31_chr.v0.1.liftover.CDS.fasta.gz

理想情况下,由文件名决定目录名,例如:TC_3370/

我认为cat URL.txt | mkdir | cd | wget | crb-blast可能有解决方案

目前我只运行以下命令:

mkdir TC_3370
cd TC_3370/
wget url 
http://assemblies/Genomes/final_assemblies/10x_meta_assemblies_v1.0/TC_3370_chr.v1.0.maker.CDS.fasta.gz
crb-blast -q TC_3370_chr.v1.0.maker.CDS.fasta.gz -t TCV2_annot_cds.fna -e 1e-20 -h 4 -o rbbh_TC

试试这个Shellcheck-clean程序:

#! /bin/bash -p
while read -r url; do
file=${url##*/}
dir=${file%%_chr.*}
mkdir -v -- "$dir"
(
cd "./$dir" || exit 1
wget -- "$url"
crb-blast -q "$file" -t TCV2_annot_cds.fna -e 1e-20 -h 4 -o rbbh_TC
)
done <URL.txt
  • 参见移除字符串的一部分(BashFAQ/100(如何在bash中进行字符串操作?)),以获得${url##*/}等的解释
  • 子shell (( ... ))用于确保cd不影响主程序。

另一个实现

#!/bin/sh
# Read lines as url as long as it can
while read -r url
do
# Get file name by stripping-out anything up to the last / from the url
file_name=${url##*/}
# Get the destination dir name by stripping anything from the first __chr
dest_dir=${file_name%%_chr*}
# Compose the wget output path
fasta_path="$dest_dir/$file_name"
if
# Successfully created the destination directory AND
mkdir -p -- "$dest_dir" &&
# Successfully downloaded the file
wget --output-file="$fasta_path" --quiet -- "$url" 
then
# Process the fasta file into fna
fna_path="$dest_dir/TCV2_annot_cds.fna"
crb-blast -q "$fasta_path" -t "$fna_path" -e 1e-20 -h 4 -o rbbh_TC
else
# Cleanup remove destination directory if any of mkdir or wget failed
rm -fr -- "$dest_dir"
fi
# reading from the URL.txt file for the whole while loop
done < URL.txt

从列表中下载文件是-i file选项的任务,如果您的文件名为urls.txt,每行一个URL,您可以简单地执行

wget -i urls.txt

请注意,这将把所有文件放在当前工作目录中,所以如果您希望将它们放在单独的目录中,则需要在wget完成后移动它们。

最新更新