尝试将特定文件复制到特定文件夹

尝试将特定文件复制到特定文件夹

该脚本将所有文件复制到所有文件夹。但我正在努力构建一个条件语句来指定每个文件复制到哪个文件夹。我已经尝试过 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

相关内容