comando trailing condicional em um forro

1

Estou procurando uma maneira de executar condicionalmente um comando à direita. Acorrentei vários comandos bash com o & & Maior que 0 run. 0 não. A é a parte relevante.

mac RC=42 $ echo "abc abc" | wc -w && echo hi
2
hi
mac $ echo "" | wc -w && echo hi
0
hi

Estou procurando uma maneira de executar o & & parte quando o wc retornar uma contagem maior que 0 e não correr para zero.

Então você pode criar algo que funcione no comando completo.

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\" " \;

Estou executando isso no terminal MacOS 10.10.5.

    
por historystamp 27.02.2018 / 01:50

3 respostas

2

Você pode canalizar para uma expressão condicional como qualquer outro comando:

$ echo | wc -w | [ $(cat) -gt 0 ] && echo hi

$ echo "abc abc" | wc -w | [ $(cat) -gt 0 ] && echo hi
hi

Esta cat em $( ... ) substituição de comando para obter a entrada canalizada na linha de comando como se estivesse escrito lá, e então testa se é numericamente maior de 0 . O bloco [ ... ] inteiro retornará verdadeiro se estiver e, caso contrário, o contrário, para que você possa usá-lo com && como de costume.

Você também pode usar test por nome, em vez de [ :

$ echo "abc abc" | wc -w | test $(cat) -gt 0 && echo hi

Você pode evitar o processo cat com read;echo $REPLY , mas isso provavelmente não importa.

No Bash, isso funciona, e o cat é executado no lugar e hora certos dentro o pipeline , mas não em outros shells (incluindo zsh). Eu não sei se isso é explicitamente especificado comportamento, mas é estável em versões Bash pelo menos para 3.2, em ambos os modos POSIX e não-POSIX (macOS sh é Bash no modo POSIX). Minha leitura do POSIX é consistente com este sendo o resultado correto.

    
por 27.02.2018 / 02:36
1

Você pode usar grep para isso.

grep -qP '\S'

Isso sairá com 0 em qualquer caractere que não seja espaço em branco na entrada. - -q significa silêncio (sem saída) - -P é para regexes Perl - \S é para um caractere que não seja espaço em branco

Alguns exemplos:

$ echo | grep -qP '\S' && echo ok
$ echo "  " | grep -qP '\S' && echo ok
$ echo " x  " | grep -qP '\S' && echo ok
ok

Se é isso que você realmente quer.

    
por 27.02.2018 / 02:33
0

O que eu faria:

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' -- {} \;

Você não pode confiar na lógica booleana de wc -v na medida em que não retorna erro quando a saída é 0

    
por 27.02.2018 / 01:59

Tags