私はコマンドを使用するときに二重引用符が$、`、\を除くすべてを文字として扱うことを学びました。
ただし、同様のコマンドを使用するときは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
(質問と直接的な関係はありませんが、ワイルドカード拡張がどのように機能するかを説明するため、これを追加しました。)