二重引用符が混乱しています。

二重引用符が混乱しています。

私はコマンドを使用するときに二重引用符が$、`、\を除くすべてを文字として扱うことを学びました。

ただし、同様のコマンドを使用するときはfind -type f -name "*.jpg" *.jpg二重引用符で囲む。まあ、それは私たちが来て*1つのキャラクターとして扱いたいことを意味します.。したがって、コマンドはパス名拡張を実装するのではなく、名前のあるfind一般ファイルを出力する必要があります。*.jpg

パス名を拡張するには、find -type f -name *.jpg二重引用符なしでコマンドを入力する必要があるようです。

しかし、結果は同じです。このコマンドに二重引用符を使用するのはなぜですか?

ベストアンサー1

ワイルドカード拡張がどのように機能するかは微妙です。 .jpg ファイルが含まれていないディレクトリに移動し、次のように入力します。

echo *.jpg

出力されます

*.jpg

特に *.jpg 文字列は変更されず、そのまま残ります。ただし、.jpgファイルを含むディレクトリに変更した場合(たとえば、image1.jpgとimage2.jpgという2つのファイルがあると仮定)、echo *.jpgコマンドは出力されません。

image1.jpg image2.jpg

そして*.jpgが拡張されます。

入力したら

find . -name *.jpg

そしてこれを入力すると、ディレクトリに.jpgファイルがありません。 find は「.」、「-name」、および「*.jpg」引数を受け取ります。ただし、.jpgファイル(image1.jpgやimage2.jpgなど)を含むディレクトリにこのコマンドを入力すると、findは "."、 "-name"、 "image1.jpg"、および "image2パラメータ"を受け取ります。 」 jpg" "なので、コマンドは実際に実行されます。

find . -name image1.jpg image2.jpg

そして文句を言うことを発見した。引用符を省略すると、本当に混乱しているのは、.jpgファイル(例:image1.jpg)が1つしかない場合です。これにより、ワイルドカード拡張が発生します。

find . -name image1.jpg

findコマンドは、デフォルト名がimage1.jpgのすべてのファイルを検索します。

余談:これは、特定のパターンに一致するファイルがあるかどうかを確認するのに便利なbashイディオムにつながります。

if [ "$(echo *.jpg)" = "*.jpg" ]; then
    # *.jpg has no matches
else
    # *.jpg has matches
fi

ただし、現在のディレクトリに「*.jpg」というファイルがある場合、この操作は機能しないことに注意してください。防水機能を強化するには、次のようにします。

if [ "$(echo *.jpg)" = "*.jpg" ] && [ ! -e "*.jpg" ]; then
    # *.jpg has no matches
else
    # *.jpg has matches
fi

(質問と直接的な関係はありませんが、ワイルドカード拡張がどのように機能するかを説明するため、これを追加しました。)

おすすめ記事