ファイル名の一部をfind
ingしてファイルを検索しています:
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*"
しかし、それらの作品の1つではありません。
更新:
これが問題だと思います:
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
from find
コマンドが問題の原因ですか? (xargs
でスペースを削除しました。)
最初に二重引用符で囲まれたものが機能するはずです。
$ 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*"
。