web-dev-qa-db-ja.com

変数付きのfindコマンドの使用方法

ファイル名の一部をfindingしてファイルを検索しています:

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でスペースを削除しました。)

1
yael

最初に二重引用符で囲まれたものが機能するはずです。

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

4
ilkkachu