假设我在/tmp中有两个文件:
root@ubuntu:~# touch /tmp/hello.{pyc,py}
root@ubuntu:~# ls /tmp/
hello.py hello.pyc现在,让我们使用rm -rf选项运行co命令
root@ubuntu:~# rm -rf /tmp/hello.py[co]
root@ubuntu:~# ls /tmp/
hello.py有人能解释一下这里发生了什么吗?[co]参数是什么?我们如何使它对其他扩展工作呢?假设我有foo.js和foo.coffee文件,我们可以做一些像rm -rf /tmp/foo.coffe[co]这样的操作来删除/tmp/foo.js吗?
发布于 2016-07-20 10:23:14
[co]不是rm命令的参数--它是一个与集合[co]中的单个字符相等的模式的shell glob --换句话说,它匹配文件名末尾的c或o。来自man bash:
[...] Matches any one of the enclosed characters为了匹配foo.coffee和foo.js,因为后缀根本不包含任何普通的子字符串,所以最好的方法是使用foo.*来匹配以foo.开头的任何文件名,您可以使用大括号展开。
rm foo.{coffee,js}发布于 2016-07-20 10:25:02
它不是一个参数,而是一个字母集合(或"shell glob")。这也是一样的:
rm -rf /tmp/hello.py[co]是相同的
rm -rf /tmp/hello.pyc
rm -rf /tmp/hello.pyo类似的..。
rm -rf /tmp/hello.py[c-o]将删除从/tmp/hello.pyc到/tmp/hello.pyo的任何内容,并按照ASCII的顺序进行。
rm -rf /tmp/hello.py[ab][cd]会移除..。
rm -rf /tmp/hello.pyac
rm -rf /tmp/hello.pyad
rm -rf /tmp/hello.pybc
rm -rf /tmp/hello.pybd比如说,我有foo.js和foo.coffee文件,我们可以做一些像
rm -rf /tmp/foo.coffe[co]这样的事情来删除/tmp/foo.js。
您可以创建一些相当花哨的方法,但是对于这两个文件,我只需为每个文件删除一个命令即可。另一个例子是尽可能接近这两个文件..。
rm /tmp/foo.[cj]*会删除这样的文件..。
rm /tmp/foo.c*
rm /tmp/foo.j*因此,它将包含远不止这两个文件。
发布于 2016-07-26 17:45:22
它是一个shell glob,类似于通配符*和? ...in bash,文件名模式*.[co]匹配以.c或.o结尾的所有文件名。
*.[co]与*.c *.o或*.{c,o}的区别在于,如果目录中不存在.o文件,则后两种模式将扩展为虚拟*.o,而*.[co]版本则不会。
Shell球形对于以不区分大小写的方式执行文件操作非常有用。例如,如果有一堆文件名以jpg、JPG、Jpg、JPg等结尾.如果你想把它们全部移除,你可以:
rm *.[Jj][Pp][Gg]https://askubuntu.com/questions/800801
复制相似问题