
Часто мне приходится аннотировать несколько документов 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 ]]
false
REPLY=$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