매개변수와 일치하는 이미지 파일을 반환하는 데 문제가 있습니다. $1은 검색 매개변수이며, 이 경우에는 "실제"이며, 지정된 폴더에 있는 하나의 이미지(두 개가 아닌)에 대한 레이블입니다. "./test.sh real"을 호출하면 하나가 아닌 두 개의 이미지가 인쇄됩니다. 함수 반환을 변수 및/또는 조건문으로 설정하는 작업을 처리해야 할 것 같지만 확실하지 않습니다.
#!/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 스크립트는 내가 원하는 것을 인쇄합니다. 두 개가 아닌 하나의 이미지만 인쇄합니다(내가 원하지 않는 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
그러나 두 번째 경우 bash는 다음을 확인합니다.
if [[ ! -z "// }" ]]; then
if "// }" is NOT zero-value, then...
그러나 테스트에 따르면 "// }"
항상 0이 아니며 두 개의 슬래시, 공백 및 중괄호로 구성된 문자열입니다. 따라서 거기에 0이 아닌 값이 있는 것이 있기 때문에 에 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
당신이 할 의향이 있다면.