basename命令无法按预期工作

时间:2013-03-25 10:07:26

标签: bash shell unix ubuntu-12.04 rename

我编写了一个shell脚本,将我的大量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

我转换的pdfs有名字

  

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

现在请注意在我的shell脚本中使用basename命令我希望得到的pdf名称为

  

DSCN2612.pdf DSCN2618.pdf DSCN2624.pdf

输出在哪里不同。 我正在使用Ubuntu 12.04和basename --version显示

  

basename(GNU coreutils)8.13版权所有(C)2011自由软件   Foundation,Inc。许可证GPLv3 +:GNU GPL版本3或更高版本   http://gnu.org/licenses/gpl.html。这是免费软件:你是   可以自由地改变和重新分配它。没有保证,对   法律允许的范围。

在终端上我只需输入

  

basename DSCN2612.JPG
  我得到了输出

     

DSCN2612.JPG

我期待的地方

  

DSCN2612

只有我的理解错误或者我使用此脚本的方式有一些错误。

1 个答案:

答案 0 :(得分:6)

basename命令有两个用途,剥离路径前缀和(可选)去除后缀。

要删除路径前缀,您只需将路径传递给路径,例如

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

要另外删除后缀,您需要告诉basename要删除的后缀,例如

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

basename DSCN2612.JPG .JPG
# DSCN2612

因此,basename不会“自动检测”后缀,因为在unix中,文件不一定有后缀。换句话说,一段时间后的字母不一定是后缀,所以你需要明确告诉它要剥离的后缀。

然而,有一些特定于bash的“自动检测”和“剥离”的替代方案。例如,

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

如果不了解更多,我可能会将您的脚本编写为

for jpg in *.JPG; do
    base=${jpg%.*}
    convert "$jpg" "$base.pdf"
done