パラメータと一致するイメージファイルを返すのに問題があります。 $ 1は検索パラメータであり、この場合は「実際」であり、指定されたフォルダ内の1つの画像(2つではない)のラベルです。 "./test.sh real"を呼び出すと、1つではなく2つの画像が印刷されます。関数の戻り値を変数および/または条件文に設定する操作を処理する必要があるようですが、わかりません。
#!/bin/bash
for f in specim/*.jpg
do
image=$(exiftool -EXIF:XPKeywords $f | grep "$1")
if [[ ! -z "$image// }" ]]; then
echo $f
fi
返される内容:
../../test.sh real
specim/image2.jpg
specim/image.jpg
このbashスクリプトは私が欲しいものを印刷します。 2つではなく1つの画像のみを印刷します(私が望んでいないEXIFtool項目ですが、これは単なるテストです)。
#!/bin/bash
for f in *.jpg
do
exiftool -EXIF:XPKeywords $f | grep $1
done
結果:
./test2.sh real
XP Keywords : name;real
どんな助けでも大変感謝します。これはとても簡単かもしれません...ありがとう
答え1
これはあなたが疑うことであり、小さな変更だけで解決することができます。以下を試してください。
if [[ ! -z "$image" ]]; then
説明する
Exiftool と grep が一致した場合、変数$image
に次のものが含まれているとします。
abcabcabc
ただし、出力がない場合は、次$image
が含まれます。 (何もなし)
テスト条件には以下が含まれます。
if [[ ! -z "$image// }" ]]; then
したがって、最初のケースでは、bashは次のことを確認します。
if [[ ! -z "abcabcabc// }" ]]; then
しかし、2番目のケースでは、bashは次のことを確認します。
if [[ ! -z "// }" ]]; then
if "// }" is NOT zero-value, then...
しかし、テストによると、"// }"
常にゼロではなく、2つのスラッシュ、スペース、および中括弧で構成される文字列です。したがって、そこにゼロ以外の値があるものがあるため、then
一致する項目がなくてもそのセクションがトリガーされる理由です$image
。したがって、それを削除すると// }
動作します。
答え2
別のオプションは次のとおりです。
if [[ -n "$image" ]]; then
$image
変数に次の項目以外が含まれていることを確認してください。! -z ...
答え3
そのディレクトリでそれぞれ実行(+テストとエコー)中です。それほど効率的ではありません。次のオプションを使用して、すべての操作を直接実行exiftool
できます。grep
.jpg
exiftool
-if EXPR
exiftool -q -s3 -if '$tag=~/pattern/' -filename ./*.jpg
-q
(これは-quietおよび-short出力形式と組み合わせられています-s[NUM]
。値のみが印刷されます。詳細についてはドキュメントを参照してください。)
したがって、特定の場合はスクリプト全体を次のように置き換えることができます。
exiftool -q -s3 -if \$Exif:XPKeywords=~/"$1"/ -filename specim/*.jpg
test.sh
たとえば、次の値を使用する4つのテストファイルを含むスクリプトを実行しますXPKeywords
。
exiftool -Exif:XPKeywords specim/*.jpg
======== specim/1.jpg
XP Keywords : xname;real
======== specim/2.jpg
XP Keywords : yname;different
======== specim/3.jpg
XP Keywords : wname;true
======== specim/4.jpg
XP Keywords : wname;unreal
4 image files read
実行test.sh real
結果:
1.jpg
4.jpg
そして、test.sh unreal
次を返します。
4.jpg
答え4
grep
grepの終了状態は一致するのですが、なぜgrepの出力をキャプチャしてから空であるかを確認するために文字列でテストするのですか?あなたはできます
if exiftool -EXIF:XPKeywords $f | grep -q "$1" ; then
echo $f
fi
やる意思があれば。