変数で 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*"

しかし、そこには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コマンドがfindこの問題を引き起こすのですか? (スペースを削除しましたxargs。)

答え1

最初の二重引用符が機能するはずです。

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

一重引用符()内では変数は拡張されず、二重引用符'*$var*'()内でドル記号をエスケープしても"*\$var*"変数は拡張されません。ドル記号()を2回エスケープすると"*\\$var*"変数が拡張されますが、findリテラルバックスラッシュも表示されます。 (しかし、findバックスラッシュをエスケープ文字として再び使用するように見えるので、意味は変わりません。)

したがって、混乱はありますが、以下も有効です。

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

set -x実際に得られる結果を確認するには、他のすべてのパラメータを有効にして実行してみてくださいfind

{}通常どおり、変数名の後に文字、数字、または下線が続く場合は、変数名を中かっこで囲みます"*${prefix}somename*"

関連情報