在命令行中首选文件类型

在命令行中首选文件类型

我经常需要使用 来注释多个 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 ]]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

相关内容