コマンドラインでファイルタイプを優先する

コマンドラインでファイルタイプを優先する

多くの場合、 を使用して複数の PDF ドキュメントに注釈を付ける必要がありますxournal。 「新しい」ファイルのディレクトリから開始する場合はpdf、 でそれらすべてを開きますxournal

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

たとえば、ファイルに注釈を付け始めるとき、.pdfそれを として保存します。つまり、ファイル拡張子を切り替えるだけです。ここで、中断されたセッションがあり、対応するファイルが存在しない場合はディレクトリ内の.xojすべてのファイルを開き、それ以外の場合はファイルを開くとします(どちらも を使用)。.pdf.xoj.xojxournal

コマンドラインでこれを実行するにはどうすればよいですか?

答え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はシェル コードとして実行されます。はREPLY現在の引数の値を保持します。.xoj現在の.pdfファイルに対応するファイルがない場合、[[ ! -f $REPLY:r.xoj ]]が返されtrue、何も起こりません (REPLYは変更されません)。現在のファイルに
対応するファイルがある場合、が返され、が実行され、(修飾子を介して)現在の引数の拡張子が に置き換えられます。.xoj.pdf[[ ! -f $REPLY:r.xoj ]]falseREPLY=$REPLY:r.xoj:r.pdf.xoj

答え4

明確かつ簡潔に説明しようとしています。fxournal を 1 か所でのみ再割り当てして呼び出し、拡張子マングリングに${f%.pdf}1 回だけアクセスします。

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

関連情報