1行の条件付き実行後続コマンド

1行の条件付き実行後続コマンド

条件付きで末尾のコマンドを実行する方法を探しています。私は&&を使用して複数の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'

入力では、空白以外の文字はゼロで終わります。 --q静かさ(出力なし)を示します。 - -PPerl 正規表現を表します。 -\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

関連情報