Prefira tipos de arquivo na linha de comando

Prefira tipos de arquivo na linha de comando

Muitas vezes tenho que anotar vários documentos PDF usando xournal. Se eu começar com um diretório de pdfarquivos "frescos", basta abrir todos eles com xournal:

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

Quando começo a anotar um arquivo, digamos, .pdfeu 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 .pdfos arquivos no diretório, desde que não .xojexista nenhum arquivo correspondente, e abra o .xojarquivo caso contrário (ambos com xournal).

Como posso fazer isso na linha de comando?

Responder1

Você pode simplesmente remover .pdfpara obter o nome do arquivo sem a extensão e verificar se há um arquivo com esse nome com a .xojextensã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 zshvocê poderia usar oecorda 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. REPLYcontém o valor do argumento atual. Se não houver nenhum .xojarquivo correspondente para o .pdfarquivo atual, ele [[ ! -f $REPLY:r.xoj ]]retorna truee nada acontece ( REPLYpermanece inalterado).
Se houver um .xojarquivo correspondente para o .pdfarquivo atual, ele [[ ! -f $REPLY:r.xoj ]]retornará falsee REPLY=$REPLY:r.xojserá executado, substituindo (por meio do :rmodificador) a .pdfextensão do argumento atual por .xoj.

Responder4

Apenas tentando deixar claro e conciso. Reatribuindo fe 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

informação relacionada