gpt4 book ai didi

bash - basename 命令未按预期工作

转载 作者:行者123 更新时间:2023-11-29 09:10:23 28 4
gpt4 key购买 nike

我写了一个 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 Copyright (C) 2011 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later http://gnu.org/licenses/gpl.html. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law.

在终端上输入

basename DSCN2612.JPG
I get the output

DSCN2612.JPG

如我所料

DSCN2612

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

最佳答案

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

关于bash - basename 命令未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15612255/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com