该脚本将所有文件复制到所有文件夹。但我正在努力构建一个条件语句来指定每个文件复制到哪个文件夹。我已经尝试过 if 语句,但根本没有复制。
我使用参数扩展的原因是因为文件名类似于 Long_John_Silver、Miss_Havisham 和 Master_Pip,文件夹名称类似于 Long、Miss 和 Master。因此,本质上我试图将文件复制到各自的文件夹,例如将 Master_Pip.fna.gz 复制到名为 Master 的文件夹中。因此,我尝试做的就是捕获文件名的第一个单词,并以某种方式将其用作参考。
for fldr in /home/scripts/playground/genomes_2/* ; do
find . -name *fna.gz | while read f ; do
basenm=${fldr##*/} ; f_name=${basenm%%_*} ;
cp -r $f /home/scripts/playground/port/$f_name/ ;
done
done
这是我的带有 if 语句的脚本,但该脚本根本不复制任何内容。
for fldr in /home/scripts/playground/genomes_2/* ; do
find . -name *fna.gz | while read f ; do
basenm=${fldr##*/} ; f_name=${basenm%%_*} ;
if [ "$f_name" == /home/scripts/playground/port/"$f_name" ] ; then
cp -r $f /home/scripts/playground/port/"$f_name"/ ;
else
continue
fi
done
done
答案1
1.更改此代码
basenm=${fldr##*/};
到这个
basenm=${f##*/} ;
并从复制命令中删除 -r 开关
cp $f /home/scripts/playground/port/"$f_name"
也许您有一些混乱的源路径,例如 /home/scripts/playground/genomes_2/Long_John_Silver/Master_Pip.fna.gz。因此,当您从文件夹名称中提取 f_name 时,fldr
您会得到“长”。然后将 Master_Pip.fna.gz 复制到 ..../Long 文件夹。 2.
“$f_name”== /home/scripts/playground/port/“$f_name”
他们不平等,也不会平等。
基本上,你的第一个脚本很好。条件是多余的,因为您通过参数扩展隐式地执行它。
我只会在复制之前添加目录创建命令。这样,如果源目录中出现新人(例如 Shorty_Pete),您始终有一个目录可以复制到该目录。
mkdir -p /home/scripts/playground/port/"$f_name"
cp ...
答案2
我意识到我正在根据文件类型(即 .fna.gz)将所有文件复制到所有文件夹中,因此我指定了要读取然后复制的 fna.gz 文件类型。不需要 if 语句,因为特殊性是通过参数扩展隐含的。现在它工作得很好。
for fldr in /home/scripts/playground/genomes_2/* ; do
basenm=${fldr##*/} ; f_name=${basenm%%_*} ;
find . -name $f_name*fna.gz | while read f ; do
cp -r $f /home/scripts/playground/port/$f_name/ ;
done
done