
Muitas vezes tenho que anotar vários documentos PDF usando xournal
. Se eu começar com um diretório de pdf
arquivos "frescos", basta abrir todos eles com xournal
:
for f in *pdf; do xournal $f&; done
Quando começo a anotar um arquivo, digamos, .pdf
eu o salvo como um .xoj
, ou seja, apenas mudo a extensão do arquivo. Agora, suponha que eu tenha uma sessão interrompida e queira abrir todos .pdf
os arquivos no diretório, desde que não .xoj
exista nenhum arquivo correspondente, e abra o .xoj
arquivo caso contrário (ambos com xournal
).
Como posso fazer isso na linha de comando?
Responder1
Você pode simplesmente remover .pdf
para obter o nome do arquivo sem a extensão e verificar se há um arquivo com esse nome com a .xoj
extensão:
for f in *.pdf
do
if [ -f "${f%.pdf}".xoj ]
then
xournal "${f%.pdf}".xoj &
else
xournal "${f}" &
fi
done
Responder2
for f in *.pdf; do
fname=$(basename "$f" .pdf);
if [[ -e "${fname}".xoj ]]; then
# .xoj file does exist, do things here
else
# .xoj file doesn't exist, do other things here
fi
done
Responder3
Com zsh
você poderia usar oe
corda qualificador global:
for f (./*.pdf(.e_'[[ ! -f $REPLY:r.xoj ]] || REPLY=$REPLY:r.xoj'_))
xournal $f &
A string [[ ! -f $REPLY:r.xoj ]] || REPLY=$REPLY:r.xoj
é executada como código shell. REPLY
contém o valor do argumento atual. Se não houver nenhum .xoj
arquivo correspondente para o .pdf
arquivo atual, ele [[ ! -f $REPLY:r.xoj ]]
retorna true
e nada acontece ( REPLY
permanece inalterado).
Se houver um .xoj
arquivo correspondente para o .pdf
arquivo atual, ele [[ ! -f $REPLY:r.xoj ]]
retornará false
e REPLY=$REPLY:r.xoj
será executado, substituindo (por meio do :r
modificador) a .pdf
extensão do argumento atual por .xoj
.
Responder4
Apenas tentando deixar claro e conciso. Reatribuindo f
e invocando o xournal em apenas um local, acessando a extensão mutilada ${f%.pdf}
apenas uma vez.
for f in *.pdf
do
xoj = "${f%.pdf}.xoj"
[ -f "$xoj" ] && f="$xoj"
xournal "$f" &
done