Prefere tipos de arquivos na linha de comando

4

Muitas vezes, tenho que anotar vários documentos em PDF usando xournal . Se eu começar com um diretório de arquivos "fresh" pdf , eu só os abro com xournal :

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

Quando eu começo a anotar um arquivo, digamos que um .pdf eu o salve como .xoj , ou seja, apenas mudo a extensão do arquivo. Agora, suponha que eu tenha uma sessão interrompida e queira abrir todos os arquivos .pdf no diretório, desde que não exista nenhum arquivo .xoj correspondente e abra o arquivo .xoj (ambos com xournal ).

Como posso fazer isso na linha de comando?

    
por student 06.11.2015 / 19:48

4 respostas

6

Você pode simplesmente remover .pdf para obter o nome do arquivo sem a extensão e verificar se há um arquivo com esse nome na extensão .xoj :

for f in *.pdf
do
    if [ -f "${f%.pdf}".xoj ]
    then
        xournal "${f%.pdf}".xoj &
    else
        xournal "${f}" &
    fi
done
    
por 06.11.2015 / 19:58
5
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
    
por 06.11.2015 / 19:56
3

Com zsh você pode usar a string e qualificador glob :

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 arquivo .xoj correspondente para o arquivo .pdf atual, então [[ ! -f $REPLY:r.xoj ]] retornará true e nada acontecerá ( REPLY permanecerá inalterado).
Se houver um arquivo .xoj correspondente para o arquivo .pdf atual, [[ ! -f $REPLY:r.xoj ]] retornará false e REPLY=$REPLY:r.xoj será executado, o que substitui (via modificador :r ) a extensão .pdf do argumento atual com .xoj .

    
por 06.11.2015 / 21:17
-2

Apenas tentando deixar claro e conciso. Re-atribuindo f e invocando xournal em apenas um lugar, acessando a extensão mangling ${f%.pdf} apenas uma vez.

for f in *.pdf
do
    xoj = "${f%.pdf}.xoj"
    [ -f "$xoj" ] && f="$xoj"
    xournal "$f" &
done
    
por 07.11.2015 / 01:18

Tags