Preferir tipos de archivos en la línea de comando

Preferir tipos de archivos en la línea de comando

A menudo tengo que anotar varios documentos pdf usando xournal. Si empiezo con un directorio de pdfarchivos "nuevos", simplemente los abro todos con xournal:

for f in *pdf; do xournal $f&; done

Cuando empiezo a anotar un archivo, diga: .pdfLo guardo como .xoj, es decir, simplemente cambio la extensión del archivo. Ahora supongamos que tengo una sesión interrumpida y quiero abrir todos .pdflos archivos en el directorio siempre que no .xojexista ningún archivo correspondiente y, de lo contrario, abrir el .xojarchivo (ambos con xournal).

¿Cómo puedo hacer esto en la línea de comando?

Respuesta1

Puedes simplemente eliminarlo .pdfpara obtener el nombre del archivo sin la extensión y buscar un archivo con ese nombre con la .xojextensió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 zshusted podría utilizar elecadena 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.xojse ejecuta como código de shell. REPLYcontiene el valor del argumento actual. Si no hay ningún .xojarchivo correspondiente para el .pdfarchivo actual, [[ ! -f $REPLY:r.xoj ]]regresa truey no sucede nada ( REPLYpermanece sin cambios).
Si hay un .xojarchivo correspondiente para el .pdfarchivo actual, [[ ! -f $REPLY:r.xoj ]]regresa falsey REPLY=$REPLY:r.xojse ejecuta, lo que reemplaza (a través del :rmodificador) la .pdfextensión del argumento actual con .xoj.

Respuesta4

Sólo trato de hacerlo claro y conciso. Reasignar fe 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

información relacionada