4

最後にたくさんのJPGをPDFに変換するシェルスクリプトを書きました

 #!/bin/bash
set -xv
for i in `ls -v *.JPG`;
 do i=$(basename "$i")
 convert "$i" "$i.pdf" ;
 done

JPGは

DSCN2612.JPG DSCN2618.JPG DSCN2624.JPG

そして私が得る変換されたpdfは名前を持っています

DSCN2612.JPG.pdf DSCN2618.JPG.pdf DSCN2624.JPG.pdf

ここで、シェルスクリプトでbasenameコマンドを使用していることに注意してください。結果として得られるpdfの名前は次のようになります。

DSCN2612.pdf DSCN2618.pdf DSCN2624.pdf

出力はどこで異なりますか。私はUbuntu12.04を使用しており、basename--versionshowsを使用しています

basename(GNU coreutils)8.13 Copyright(C)2011 Free Software Foundation、Inc. License GPLv3 +:GNUGPLバージョン3以降 http://gnu.org/licenses/gpl.html。これはフリーソフトウェアです。自由に変更して再配布できます。法律で許可されている範囲で、保証はありません。

ターミナルで入力するだけ

ベース名DSCN2612.JPG
出力を取得します

DSCN2612.JPG

私が期待するところ

DSCN2612

私の理解が間違っているか、このスクリプトの使用方法にエラーがあるだけです。

4

1 に答える 1

7

このbasenameコマンドには、パスプレフィックスの削除と(オプションで)サフィックスの削除の2つの用途があります。

パスプレフィックスを削除するには、たとえばパスを渡すだけです。

basename /path/to/file.ext
# file.ext

basename接尾辞をさらに削除するには、たとえば、削除する接尾辞を指定する必要があります

basename /path/to/file.ext .ext
# file

basename DSCN2612.JPG .JPG
# DSCN2612

したがって、basenameUNIXではファイルに必ずしもサフィックスが付いているとは限らないため、サフィックスを「自動検出」しません。つまり、ピリオドの後の文字は必ずしも接尾辞ではないため、削除する接尾辞を明示的に指定する必要があります。

ただし、「自動検出」とストリップには、bash固有の代替手段がいくつかあります。例えば、

x="file.ext"
echo ${x%.*}
# file

詳細を知らずに、私はあなたのスクリプトを次のように書くかもしれません

for jpg in *.JPG; do
    base=${jpg%.*}
    convert "$jpg" "$base.pdf"
done
于 2013-03-25T10:12:35.830 に答える