변수와 함께 find 명령을 사용하는 방법

변수와 함께 find 명령을 사용하는 방법

find이름의 일부로 파일을 검색하고 있습니다.

find /script -name '*file_topicv*'
/script/VER_file_topicv_32.2.212.1

작동하지만 파일 이름의 일부가 변수인 경우에는 작동하지 않습니다.

var=file_topicv

find파일이 존재함에도 불구하고 파일을 찾을 수 없다고 보고합니다.

find /script -name '*$var*'

여기에 문제가 있나요?


나는 또한 다음을 시도했습니다:

find /script -name "*$var*"
find /script -name "*\$var*"
find /script -name "*\\$var*"

그러나 거기에는 단 하나의 작품도 없습니다.


고쳐 쓰다:

나는 이것이 문제라고 생각합니다.

var=` find /tmp -name '*.xml' -exec sed -n 's/<Name>\([^<]*\)<\/Name>/\1/p' {} +  |  xargs `

echo $var
generateFMN

ls  /script/VERSIONS | grep "$var"

NO OUTPUT

var=generateFMN
 ls  /script/VERSIONS | grep "$var"
VER_generateFMN_32.2.212.1

그렇다면 왜 슬레이브 $var명령이 find이 문제를 일으키는가? (공백을 제거했습니다 xargs.)

답변1

첫 번째 큰따옴표가 작동해야 합니다.

$ touch asdfghjkl
$ var=fgh
$ find -name "*$var*"
./asdfghjkl

작은따옴표( ) 내에서는 변수가 확장되지 않으며, '*$var*'큰따옴표( ) 내에서 달러 기호를 이스케이프 "*\$var*"하면 변수가 확장되지 않습니다 . 달러 기호( )를 두 번 이스케이프 하면 "*\\$var*"변수가 확장되지만 find리터럴 백슬래시도 표시됩니다. (그러나 find백슬래시를 다시 이스케이프 문자로 사용하는 것 같아서 의미가 바뀌지는 않습니다.)

따라서 혼란스럽기는 하지만 다음도 유효합니다.

$ set -x
$ find -name "*\\$var*"
+ find -name '*\fgh*'
./asdfghjkl

set -x실제로 얻는 결과를 확인하려면 다른 모든 매개변수를 활성화한 상태에서 실행해 볼 수 있습니다 find.

{}평소와 같이 변수 이름 뒤에 문자, 숫자 또는 밑줄이 오는 경우 변수 이름을 중괄호로 묶습니다(예: ) "*${prefix}somename*".

관련 정보