Предпочитать типы файлов в командной строке

Предпочитать типы файлов в командной строке

Часто мне приходится аннотировать несколько документов PDF с помощью xournal. Если я начинаю с каталога «свежих» pdfфайлов, я просто открываю их все с помощью xournal:

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

Когда я начинаю аннотировать файл, скажем, .pdfя сохраняю его как .xoj, т. е. я просто меняю расширение файла. Теперь предположим, что у меня прерванный сеанс, и я хочу открыть все .pdfфайлы в каталоге, при условии, что соответствующего .xojфайла не существует, и открыть .xojфайл в противном случае (оба с помощью xournal).

Как это сделать в командной строке?

решение1

Вы можете просто удалить .pdf, чтобы получить имя файла без расширения и проверить наличие файла с таким же именем и расширением .xoj:

for f in *.pdf
do
    if [ -f "${f%.pdf}".xoj ]
    then
        xournal "${f%.pdf}".xoj &
    else
        xournal "${f}" &
    fi
done

решение2

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

решение3

С zshвами можно было бы использоватьeнить квалификатор glob:

for f (./*.pdf(.e_'[[ ! -f $REPLY:r.xoj ]] || REPLY=$REPLY:r.xoj'_))
xournal $f &

Строка [[ ! -f $REPLY:r.xoj ]] || REPLY=$REPLY:r.xojвыполняется как шелл-код. REPLYсодержит значение текущего аргумента. Если .xojдля текущего .pdfфайла нет соответствующего файла, то [[ ! -f $REPLY:r.xoj ]]возвращается trueи ничего не происходит ( REPLYостается неизменным). Если для текущего файла
есть соответствующий файл, то возвращается и выполняется, который заменяет (через модификатор) расширение текущего аргумента на ..xoj.pdf[[ ! -f $REPLY:r.xoj ]]falseREPLY=$REPLY:r.xoj:r.pdf.xoj

решение4

Просто пытаюсь сделать это понятным и кратким. Переназначение fи вызов xournal только в одном месте, обращение к искажению расширения ${f%.pdf}только один раз.

for f in *.pdf
do
    xoj = "${f%.pdf}.xoj"
    [ -f "$xoj" ] && f="$xoj"
    xournal "$f" &
done

Связанный контент