私のLinuxシステムでは、パラメータ($ LIB_TO_REMOVE)に保存した特定の単語を含むディレクトリを削除したいと思います。ただし、ワイルドカードとパラメータ拡張(最初に確認)を使用すると、ls
シェルはワイルドカードを*
ワイルドカードとして解釈しません。どんな提案がありますか?ls *${LIB_TO_REMOVE}*
最初の3つのディレクトリが一覧表示されます。
$ ls
NG-23827_01_AD_02_BI_LS_01_F4_lib390563_6741_1_quant
NG-23827_01_AD_04_BI_LS_01_A7_lib390582_6741_1_quant
NG-23827_01_AD_04_BI_NL_02_B7_lib390583_6737_1_quant
NG-23827_01_AD_05_BI_LS_01_A11_lib390614_6741_2_quant
NG-23827_01_AD_05_BI_LS_02_A8_lib390590_6741_1_quant
NG-23827_01_AD_05_BI_NL_01_C9_lib390600_6741_1_quant
NG-23827_01_AD_06_BI_NL_02_E3_lib390554_6741_1_quant
NG-23827_01_AD_07_BI_LS_02_G5_lib390572_6741_1_quant
NG-23827_01_AD_07_BI_NL_02_F1_lib390539_6751_1_quant
NG-23827_01_AD_08_BI_LS_02_G8_lib390596_6741_1_quant
$ echo $LIB_TO_REMOVE
lib390563 lib390582 lib390583
$ ls *${LIB_TO_REMOVE}*
ls: cannot access *lib390563: No such file or directory
ls: cannot access lib390582: No such file or directory
ls: cannot access lib390583*: No such file or directory
答え1
変数は単一の文字列ですlib390563 lib390582 lib390583
。したがって、表示されるエラーメッセージに応じて、スペースのデフォルトトークン化は、「名前が文字列で終わる、まったく同じ、または文字列で始まるすべてのファイルまたはディレクトリ」を*${LIB_TO_REMOVE}*
意味すると想定されます。この基準に一致する名前のファイルやディレクトリがないため、何も表示されません。考えられる解決策は次のとおりです。lib390563
lib390582
lib390583
変数の内容を制御できるため、これを安全に実行できます。
$ for i in $LIB_TO_REMOVE; do ls -d *"$i"*; done NG-23827_01_AD_02_BI_LS_01_F4_lib390563_6741_1_quant NG-23827_01_AD_04_BI_LS_01_A7_lib390582_6741_1_quant NG-23827_01_AD_04_BI_NL_02_B7_lib390583_6737_1_quant
しかし、参考にしてください一般的な質問引用符なしで変数を使用する方法。
文字列の代わりに配列を変数として使用します。
$ LIB_TO_REMOVE=(lib390563 lib390582 lib390583) $ for i in "${LIB_TO_REMOVE[@]}"; do ls -d *"$i"*; done NG-23827_01_AD_02_BI_LS_01_F4_lib390563_6741_1_quant NG-23827_01_AD_04_BI_LS_01_A7_lib390582_6741_1_quant NG-23827_01_AD_04_BI_NL_02_B7_lib390583_6737_1_quant