bash:フォルダ名パターンに基づいてフォルダで動作する

bash:フォルダ名パターンに基づいてフォルダで動作する

私は、名前が次の構文の多くのフォルダを含むディレクトリ内の特定のフォルダを選択することをしています。 prot_cne_ligNNN(ここでNNNは1から1000までの数字)

選択した番号(NNNに付属)のフォルダを選択し、別のフォルダにコピーするbashスクリプトが必要です。

# define the list on numbers, which directories will be coppied
# meaning that I need to take a directory prot_cne_lig331, prot_cne_lig767, prot_cne_lig998
list=['331','767','998']
for system in ${somewhere}/*
system_name=$(basename "$system")
   if system_name == '*one_of_the_element_from_the_list*'
   cp $system $desired_output_folder
   fi
done

したがって、ここでは、フォルダ名にリストに記載されている数字の1つが含まれていることを確認するのに適したIFステートメントを正確に定義する必要があります。

ベストアンサー1

ディレクトリ内のすべての名前を繰り返し、リストに対してそれぞれをテストするよりも、リストを繰り返す方が簡単です。

list=( 331 767 998 )

for number in "${list[@]}"; do
    cp -r "$somewhere/prot_cne_lig$number" "$destdir"
done

で配列を定義する構文を参照してくださいbash

あるいは別の配列変数なしで、

for number in 331 767 998; do
    cp -r "$somewhere/prot_cne_lig$number" "$destdir"
done

または、次のものを使用できます。

shopt -s extglob
cp -r "$somewhere"/prot_cne_lig@(331|767|998) "$destdir"

括弧内のパターンと一致する@(331|767|998)拡張ワイルドカードパターンはどこにありますか(so)。shopt -s extglob

おすすめ記事