“rm -rf filename[co]”命令中的 [co] 是什么意思?

ane*_*hep 16 command-line bash rm

假设我有两个文件/tmp

root@ubuntu:~# touch /tmp/hello.{pyc,py}

root@ubuntu:~# ls /tmp/
hello.py  hello.pyc
Run Code Online (Sandbox Code Playgroud)

现在,让我们rm -rf使用 [co] 选项运行命令

root@ubuntu:~# rm -rf /tmp/hello.py[co]

root@ubuntu:~# ls /tmp/
hello.py
Run Code Online (Sandbox Code Playgroud)

有人可以解释一下这里发生了什么吗?[co]参数是什么?我们如何使它适用于其他扩展?说我有foo.jsfoo.coffee文件,我们可以做一些事情rm -rf /tmp/foo.coffe[co]来删除/tmp/foo.js吗?

ste*_*ver 35

[co]不是rm命令的参数——它是一个shell glob,它匹配等于集合中单个字符的模式[co]——换句话说,它匹配文件名的结尾acoa。来自man bash

[...]  Matches any one of the enclosed characters
Run Code Online (Sandbox Code Playgroud)

要匹配foo.coffeeand foo.js,因为后缀根本不包含任何公共子字符串,所以你能做的最好的事情是foo.*匹配以开头的任何文件名,foo.你可以使用大括号扩展,例如

rm foo.{coffee,js}
Run Code Online (Sandbox Code Playgroud)

  • _搜索模式_如`[abc]` 或`*` 将_搜索文件_,而`{}` 则不会。转到/tmp,输入`echo nya[ab]; echo nya{a,b}`,然后是`touch nyaa`,然后是`echo nya[ab]; echo nya{a,b}` (7认同)

Rin*_*ind 16

它不是一个参数,而是一组字母(或“shell glob”)。这是一样的:

rm -rf /tmp/hello.py[co]
Run Code Online (Sandbox Code Playgroud)

是相同的

rm -rf /tmp/hello.pyc
rm -rf /tmp/hello.pyo
Run Code Online (Sandbox Code Playgroud)

相似的 ...

rm -rf /tmp/hello.py[c-o]
Run Code Online (Sandbox Code Playgroud)

将删除从以下 ASCII 顺序/tmp/hello.pyc开始(包括/tmp/hello.pyo以下内容)的任何内容。

rm -rf /tmp/hello.py[ab][cd]
Run Code Online (Sandbox Code Playgroud)

将删除...

rm -rf /tmp/hello.pyac
rm -rf /tmp/hello.pyad
rm -rf /tmp/hello.pybc
rm -rf /tmp/hello.pybd
Run Code Online (Sandbox Code Playgroud)

比如说,我有 foo.js 和 foo.coffee 文件,我们能不能做点什么rm -rf /tmp/foo.coffe[co]来删除/tmp/foo.js.

您可以制作相当奇特的方法,但对于这 2 个文件,我只需为每个文件删除 1 个命令。另一个例子是尽可能接近这两个文件......

rm /tmp/foo.[cj]*
Run Code Online (Sandbox Code Playgroud)

会删除这样的文件...

rm /tmp/foo.c*
rm /tmp/foo.j*
Run Code Online (Sandbox Code Playgroud)

所以它包含的不仅仅是这两个文件。

  • 如果我没有误解,您会在所有匹配项中获得一次 `rm -rf` 调用,而每个匹配项的调用次数并不多。 (2认同)