我编写了一个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
只有我的理解错误或者我使用此脚本的方式有一些错误。
答案 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