Bash basename命令未按预期工作
我编写了一个shell脚本,将我的许多JPG转换为pdfBash basename命令未按预期工作,bash,shell,unix,ubuntu-12.04,rename,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 我得到的转换PDF都有名字 DSCN2612.JPG.pdf DSCN2618.JPG.pdf DSCN2624.JPG.pdf 现在请注意,在我的she
#!/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
输出在哪里是不同的。
我正在使用Ubuntu12.04和basename——版本显示
basename(GNU coreutils)8.13版权所有(C)2011自由软件
基金会,GPRV3+:GNU GPL版本3或更高版本
. 这是自由软件:你是
可以自由更改和重新分发。对客户而言,没有任何保修
法律允许的范围
在终端上时,我只需键入
basename DSCN2612.JPG我得到输出 DSCN2612.JPG 如我所料,在哪里 DSCN2612
只有这样,我的理解是错误的,或者我使用这个脚本的方式有一些错误 basename命令有两种用途,剥离路径前缀和(可选)剥离后缀 例如,要去除路径前缀,只需向其传递路径即可
basename /path/to/file.ext
# file.ext
basename /path/to/file.ext .ext
# file
basename DSCN2612.JPG .JPG
# DSCN2612
要额外去除后缀,您需要告诉basename
您希望去除的后缀,例如
basename /path/to/file.ext
# file.ext
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
您必须指定要删除的后缀-例如
basename DSCN2612.JPG.JPG
outputsDSCN2612
您是对的,我做了相同的操作,但即使这样,我也无法在键入的终端上获得转换后的pdf,而输入的是convert DSCN2602.JPG`basename$2.JPG`.pdf
,但输出是bash.pdfI添加到我的答案中的不同版本的脚本,看看这是否有帮助。我遇到了一个问题,因为我的换行符是CRLF而不是LF,所以字符串有一个尾随的回车符。为了能够使用具有文件扩展名的convert命令,我需要的是convert somename.JPG somename.pdf
convert是imagemagick库的一部分。在这种情况下,我需要给filename.JPGRight,这就是我在最后添加的脚本应该做的。那太好了,我刚刚用你的逻辑库=$(basename“$I”.JPG)尝试了我的脚本,它工作了${VAR%pattern}
是POSIX的标准特性,而不是bash
扩展。