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*"
.