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