조건부로 후행 명령을 실행하는 방법을 찾고 있습니다. 나는 &&를 사용하여 여러 bash 명령을 함께 연결합니다. 0보다 큰 실행. 0 아니요. 관련 부분입니다.
mac RC=42 $ echo "abc abc" | wc -w && echo hi
2
hi
mac $ echo "" | wc -w && echo hi
0
hi
wc
반환 횟수가 0보다 클 때 && 부분을 0으로 실행하는 대신 실행하는 방법을 찾고 있습니다 .
따라서 전체 명령 내에서 작동하는 것을 생각해 낼 수 있습니다.
find '/Users/mac/exifin/' \( -iname "*.nef" -o -iname "*.dng" \) -type f \
-exec sh -c "ls -l \"{}\" && /usr/local/bin/exiftool -GPSLatitude -GPSLongitude \"{}\" |\
wc -w && echo copy && cp \"{}\" '/Users/mac/exifout/' && echo \" Delivered\" " \;
저는 이것을 MacOS 10.10.5 터미널에서 실행하고 있습니다.
답변1
다른 명령과 마찬가지로 조건식을 파이프할 수 있습니다.
$ echo | wc -w | [ $(cat) -gt 0 ] && echo hi
$ echo "abc abc" | wc -w | [ $(cat) -gt 0 ] && echo hi
hi
cat
내부$( ... )
명령 대체마치 거기에 쓰여진 것처럼 명령줄에 파이프 입력을 한 다음해당 값이 0보다 큰지 테스트합니다.. [ ... ]
그렇다면 블록 전체가 true를 반환하고, 그렇지 않으면 false를 반환하므로 &&
평소대로 사용할 수 있습니다.
당신은 또한 사용할 수 있습니다test
다음 대신 이름으로 [
:
$ echo "abc abc" | wc -w | test $(cat) -gt 0 && echo hi
cat
대신 프로세스 를 피할 수 있지만 read;echo $REPLY
아마도 중요하지 않을 것입니다.
Bash에서는 이것이 cat
올바른 장소와 시간에 작동하고 실행됩니다.파이프 내부, 그러나 다른 일부 쉘(zsh 포함)에서는 그렇지 않습니다. 이것이 명시적으로 지정된 동작인지는 모르겠지만 sh
적어도 3.2 이전의 Bash 버전에서는 POSIX 모드와 비 POSIX 모드(macOS는 POSIX 모드의 Bash입니다) 모두에서 안정적입니다. POSIX에 대한 나의 독서는 이것이 올바른 결과라는 것과 일치합니다.
답변2
grep
이런 목적 으로 사용할 수 있습니다 .
grep -qP '\S'
입력에서 공백이 아닌 문자는 0으로 종료됩니다. - -q
조용함(출력 없음)을 나타냅니다. - -P
Perl 정규식을 나타냅니다. - \S
공백이 아닌 문자를 나타냅니다 .
몇 가지 예:
$ echo | grep -qP '\S' && echo ok
$ echo " " | grep -qP '\S' && echo ok
$ echo " x " | grep -qP '\S' && echo ok
ok
이것이 당신이 정말로 원하는 것이라면.
답변3
나는 무엇을 할 것인가:
find '/Users/mac/exifin/' \( -iname "*.nef" -o -iname "*.dng" \) -type f -exec bash -c 'if test -f "$1"; then if (( $(/usr/local/bin/exiftool -GPSLatitude -GPSLongitude "$1" | wc -w) > 0)); then echo copy; cp "$1" "/Users/mac/exifout/" && echo "Delivered"; fi; fi' -- {} \;
wc -v
출력 시 오류를 반환하지 않으므로 부울 논리에 의존할 수 없습니다.0