雏鹰部落

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 997|回复: 1

[学习/资料] 在 Bash 中使用[方括号] (一)

[复制链接]
发表于 2019-4-22 01:30:07 | 显示全部楼层 |阅读模式
在Bash 中使用[方括号] (一)这篇文章将要介绍方括号及其在命令行中的不同用法。
看完花括号在命令行中的用法之后,现在我们继续来看方括号([])在上下文中是如何发挥作用的。

通配
方括号最简单的用法就是通配。列出具有相同特征的多个文件就是一个很常见的场景,例如列出所有JPEG 文件:
ls*.jpg

使用通配符来得到符合某个模式的所有内容,这个过程就叫通配。
在上面的例子当中,星号(*)就代表“0 个或多个字符”。除此以外,还有代表“有且仅有一个字符”的问号(?)。因此
lsd*k*

可以列出 darklyducky,而且 darkduck 也是可以被列出的,因为 * 可以匹配0 个字符。而
lsd*k?

则只能列出 ducky,不会列出 darklydarkduck
方括号也可以用于通配。为了便于演示,可以创建一个用于测试的目录,并在这个目录下创建文件:

touchfile0{0..9}{0..9}

执行上面这个命令之后,就会创建 file000file001、……、file099 这100 个文件。
如果要列出这些文件当中第二位数字是7 或8 的文件,可以执行:

lsfile0[78]?

如果要列出 file022file027file028file052file057file058file092file097file098,可以执行:

lsfile0[259][278]

当然,不仅仅是 ls,很多其它的命令行工具都可以使用方括号来进行通配操作。但在删除文件、移动文件、复制文件的过程中使用通配,你需要有一点横向思维。
例如将 file010file029 这30 个文件复制成 archive010archive029 这30 个副本,不可以这样执行:

cpfile0[12]? archive0[12]?

因为通配只能针对已有的文件,而 archive 开头的文件并不存在,不能进行通配。
而这条命令

cpfile0[12]? archive0[1..2][0..9]

也同样不行,因为 cp 并不允许将多个文件复制到多个文件。在复制多个文件的情况下,只能将多个文件复制到一个指定的目录下:

mkdirarchive
cpfile0[12]? archive


这条命令是可以正常运行的,但它只会把这30 个文件以同样的名称复制到 archive/ 目录下,而这并不是我们想要的效果。
如果你阅读过我关于花括号的文章,你大概会记得可以使用 % 来截掉字符串的末尾部分,而使用 # 则可以截掉字符串的开头部分。
例如:

myvar="Hello World"
echoGoodbyeCruel${myvar#Hello}


就会输出 Goodbye Cruel World,因为 #Hellomyvar 变量中开头的 Hello 去掉了。
在通配的过程中,也可以使用这一个技巧。

fori infile0[12]?;\
do\
cp$i archive${i#file};\
done


上面的第一行命令告诉Bash 需要对所有 file01 开头或者 file02 开头,且后面只跟一个任意字符的文件进行操作,第二行的 do 和第四行的 done 代表需要对这些文件都执行这一块中的命令。
第三行就是实际的复制操作了,这里使用了两次 $i 变量:第一次在 cp 命令中直接作为源文件的文件名使用,第二次则是截掉文件名开头的 file 部分,然后在开头补上一个 archive,也就是这样:

"archive"+ "file019"- "file"= "archive019"

最终整个 cp 命令展开为:

cpfile019 archive019

最后,顺带说明一下反斜杠 \ 的作用是将一条长命令拆分成多行,这样可以方便阅读。
发表于 2019-8-13 14:16:52 | 显示全部楼层
thanks for sharing
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|熊猫同学技术论坛|小黑屋| 网络工程师论坛 ( 沪ICP备09076391 )

GMT+8, 2024-12-22 18:47 , Processed in 0.077635 second(s), 18 queries , Gzip On.

快速回复 返回顶部 返回列表