Contexto: zsh Catalina MacOS:
O script executável BatesStamp envolve o imagemagick para carimbar um número em um arquivo jpg:
# BatesStamp: OVERWRITES and stamps ONE file with COUNTER (upper left corner)
# usage ./BatesStamp COUNTER PATH_FILE
# to be used with find & -exec: https://unix.stackexchange.com/a/96239/182280
COUNTER=$1 # 1st argument = number to be stamped upon .jpg file
PATH_FILE=$2 # 2nd argument = /path_to_file/Filename.jpg
convert $PATH_FILE -auto-orient -gravity northWest -font "Arial-Bold-Italic" -pointsize 175 \
-fill red -annotate +30+30 "$COUNTER" $PATH_FILE;
((COUNTER++)) #https://stackoverflow.com/a/21035146/4953146
echo "watermarked i= $COUNTER $PATH_FILE"
O objetivo é carimbar todos os arquivos .jpg na árvore de diretórios com um número único. Acredito que $COUNTER deve ser incrementado toda vez que for chamado: isso garante que cada arquivo seja carimbado com um número exclusivo. A estratégia é percorrer todos os subdiretórios find
para identificar arquivos .jpg e BatesStamp cada arquivo .jpg com $COUNTER++.
Este script goBatesStamp.sh
percorre subdiretórios para executar cada arquivo .jpg a ser processado pelo BatesStamp
# goBastesStamp.sh
cd /Users/user/Desktop/AITH_USB_Hope_Submitted_MyCloud/PhotoGraphs_Work/A_Building_NoBulkhead. # navigate to top level directory
COUNTER=100 # initialize COUNTER
find /Users/user/Desktop/AITH_USB_Hope_Submitted_MyCloud/PhotoGraphs_Work/A_Building_NoBulkhead -iname "*.jpg" -exec ./BatesStamp $((COUNTER+=1)) {} \;
O problema está na linha que começa com o find
comando. Especificamente, o COUNTER não incrementa.
Teste mostram que arquivos .jpg são carimbados com o número 100 Parece que o $((COUNTER++)) é o problema. Qual é a sintaxe adequada para incrementar o COUNTER em um e alimentar o COUNTER incrementado em ./BatesStamp?
No
código shell, que
$((COUNTER+=1))
é expandido pelo shell que interpreta essa linha de comando antes de invocar ofind
comando, entãofind
é invocado como:E para cada arquivo encontrado, ele chama
./BateStamp 101 path/to/the/file
.Mesmo se você alterou para:
para
find
iniciar um shell que incremente sua própria$COUNTER
variável e processe vários arquivos em um loop, que ainda não funcionaria, poisfind
ainda-exec cmd {} +
pode chamarcmd
várias vezes, cada um com um lote de arquivos, e cada invocação dissosh
acima começaria em 100 novamente.Aqui, você precisaria de uma invocação de sh ou algum outro shell ou linguagem de programação que processe todos os arquivos em uma invocação.
Como você já está usando
zsh
, você deve ser capaz de fazer:Aqui usando
zsh
globs recursivos (onde**/
corresponde a 0 ou mais níveis de subdiretórios) em vez defind
encontrar osjpg
arquivos (restrito a arquivos regulares com o.
qualificador glob e classificando a lista de entrada numericamente comn
¹ em vez de processá-los em ordem aleatória comofind
faz) e usandomogrify
em vez deconvert
como esse é o comando ImageMagick para editar uma imagem no local.Observe que para um script ser interpretado por um interpretador que não
sh
seja executado diretamente, você precisa de uma linha she-bang (#! /path/to/the/interpreter
) para informar ao sistema qual interpretador usar para interpretar o conteúdo do arquivo. Ou você pode invocar o interpretador manualmente no arquivo:zsh /path/to/that/file
, ou fazer com que o shell interativo que você está usando no momento (se zsh) o interprete diretamente comsource /path/to/that/file
ou em um subshell para que ele não altere o ambiente de sua sessão de shell com(source /path/to/that/file)
.¹ sem o qualificador glob
n
(para onumericglobsort
qual é uma opção que também pode ser habilitada globalmente), a classificação é lexical, então,image2.jpg
por exemplo, viria depoisimage10.jpg
porque2
vem depois1
na ordem de agrupamento.² se você se pergunta sobre o extra
-
no#! /bin/zsh -
shebang, veja Por que o "-" no "#! /bin/sh -" shebang?