
A menudo tengo que anotar varios documentos pdf usando xournal
. Si empiezo con un directorio de pdf
archivos "nuevos", simplemente los abro todos con xournal
:
for f in *pdf; do xournal $f&; done
Cuando empiezo a anotar un archivo, diga: .pdf
Lo guardo como .xoj
, es decir, simplemente cambio la extensión del archivo. Ahora supongamos que tengo una sesión interrumpida y quiero abrir todos .pdf
los archivos en el directorio siempre que no .xoj
exista ningún archivo correspondiente y, de lo contrario, abrir el .xoj
archivo (ambos con xournal
).
¿Cómo puedo hacer esto en la línea de comando?
Respuesta1
Puedes simplemente eliminarlo .pdf
para obtener el nombre del archivo sin la extensión y buscar un archivo con ese nombre con la .xoj
extensión:
for f in *.pdf
do
if [ -f "${f%.pdf}".xoj ]
then
xournal "${f%.pdf}".xoj &
else
xournal "${f}" &
fi
done
Respuesta2
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
Respuesta3
Con zsh
usted podría utilizar ele
cadena calificador global:
for f (./*.pdf(.e_'[[ ! -f $REPLY:r.xoj ]] || REPLY=$REPLY:r.xoj'_))
xournal $f &
La cadena [[ ! -f $REPLY:r.xoj ]] || REPLY=$REPLY:r.xoj
se ejecuta como código de shell. REPLY
contiene el valor del argumento actual. Si no hay ningún .xoj
archivo correspondiente para el .pdf
archivo actual, [[ ! -f $REPLY:r.xoj ]]
regresa true
y no sucede nada ( REPLY
permanece sin cambios).
Si hay un .xoj
archivo correspondiente para el .pdf
archivo actual, [[ ! -f $REPLY:r.xoj ]]
regresa false
y REPLY=$REPLY:r.xoj
se ejecuta, lo que reemplaza (a través del :r
modificador) la .pdf
extensión del argumento actual con .xoj
.
Respuesta4
Sólo trato de hacerlo claro y conciso. Reasignar f
e invocar xournal en un solo lugar, accediendo a la extensión destrozando ${f%.pdf}
solo una vez.
for f in *.pdf
do
xoj = "${f%.pdf}.xoj"
[ -f "$xoj" ] && f="$xoj"
xournal "$f" &
done