我们经常会批量修改文件名,保留扩展名或转换文件格式或提取文件名,那么下面的一些命令将很有用。
使用%操作符提取文件名
1
2
3
4
|
touch sample.jpg
file_jpg="sample.jpg"
name=${file_jpg%.*}
echo "File name is: $name"
|
原理
${VAR%.*}
从右往左删除%右边匹配的字符,上例中的(.*)
匹配到的是.jpg
,所以输出结果只有文件名。
也可以使用%%操作符,与%
与%%
相比,%是最短匹配也叫非贪婪匹配,%%是最长匹配也叫贪婪匹配。
使用#操作符提取扩展名
1
2
3
|
touch sample.jpg
extension=${file_jpg#*.}
echo "File Extension is: $extension"
|
原理
${VAR#*.}
从左往右匹配,删除匹配到的字符。
和%%类似,#也有一个对应的贪婪操作符##。
例子
1
2
3
4
5
6
7
8
9
10
|
$ URL="www.google.com"
$ echo $URL
$ echo ${URL%.*} # 删除从右侧开始第一个.匹配的内容,为非贪婪匹配
www.google
$ echo ${URL%%.*} # 删除从右侧开始所有.右端的内容,为贪婪匹配
www
$ echo ${URL#*.} # 删除从左侧开始第一个.匹配的内容,为非贪婪匹配,过滤出二级域名
google.com
$ echo ${URL##*.} # 删除从左侧开始所.匹配的内容,为贪婪匹配,过滤出顶级域名
com
|
考虑文件名中可能有多个.所以贪婪匹配更常用
关于{Curly Braces}
操作符其他用法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
# 按顺序生成连续的数字
$ echo {0..10}
0 1 2 3 4 5 6 7 8 9 10
# 按倒序生成连续的数字
$ echo {10..0}
10 9 8 7 6 5 4 3 2 1 0
# 按步长倒序生成数字
$ echo {10..0..2}
10 8 6 4 2 0
# 按位置输出
$ month=("Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec")
$ echo ${month[3]}
Apr
# 修改后缀
$ file_img=image.jpg
$ echo ${file_img%jpg}png
image.png
# 可以使用 convert $i ${i%jpg}png 转换图片格式
# 批量转换 for i in *.jpg; do convert $i ${i%jpg}png; done
# 判断变量是否有值
fname=test.jpg
$ echo ${fname:+abc}
abc
fname="" # 变量为空不输出
$ echo ${dname:+abc}
# ${dname:-def} 与 ${fname:+abc} 用法相反
# 替换后缀名
$ fname="1.txt"
$ echo ${fname/.txt/.log}
1.log
|