4

我写了一个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

我得到的转换后的pdf文件有名字

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 Free Software Foundation, Inc. 许可证 GPLv3+:GNU GPL 版本 3 或更高版本 http://gnu.org/licenses/gpl.html。这是免费软件:您可以自由更改和重新分发它。在法律允许的范围内,不提供任何保证。

在终端上我只需输入

basename DSCN2612.JPG
我得到了输出

DSCN2612.JPG

正如我所料

DSCN2612

只有这样我的理解是错误的,或者我使用这个脚本的方式有一些错误。

4

1 回答 1

7

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
于 2013-03-25T10:12:35.830 回答