我经常需要使用 来注释多个 pdf 文档xournal
。如果我从“新鲜”文件的目录开始pdf
,我只需使用以下命令打开它们xournal
:
for f in *pdf; do xournal $f&; done
当我开始注释一个文件时,假设.pdf
我将其另存为 a .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
细绳 全局限定符:
for f (./*.pdf(.e_'[[ ! -f $REPLY:r.xoj ]] || REPLY=$REPLY:r.xoj'_))
xournal $f &
该字符串[[ ! -f $REPLY:r.xoj ]] || REPLY=$REPLY:r.xoj
作为 shell 代码执行。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