このスクリプトは、すべてのファイルをすべてのフォルダにコピーします。しかし、各ファイルがコピーされるフォルダを指定する条件文を作成するのが困難です。 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
「long」と表示されます。次に、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 ...