내 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