如何删除文件名中包含数字“3”或“2”的文件?

I a*_*Fat 5 command-line files rm

我目前正在尝试删除一些文件。我要删除的文件包含数字 3 或 2,两者或其中之一。

如何删除包含这些数字的文件?

这些文件的命名如下:

K-0_0_1_1_1_1_1_0.wav
K-0_0_1_1_1_1_1_1.wav
K-0_1_0_0_0_0_0_0.wav
K-0_1_0_0_0_0_0_1.wav
K-0_1_0_0_0_0_1_0.wav
K-0_0_0_0_0_0_0_2.wav
K-0_0_0_0_0_0_0_3.wav
K-0_0_0_0_0_0_1_2.wav
Run Code Online (Sandbox Code Playgroud)

在此列表中,应删除最后三个文件。

Zan*_*nna 20

对于当前目录,您可以使用:

rm -- *[23]*
Run Code Online (Sandbox Code Playgroud)

如果你想限制它,只匹配 2 或 3 必须出现在K和之间的文件.wav

rm K*[23]*.wav
Run Code Online (Sandbox Code Playgroud)

如果您想通过强制rm要求对每个文件进行确认来使其更安全,请使用-i交互式标志:

rm -i K*[23]*.wav
Run Code Online (Sandbox Code Playgroud)

###笔记

  • shell glob*匹配任意数量(包括零)的任意字符
  • 外壳[some chars]是一个字符类 - 里面的任何东西都可以匹配
  • --被识别rm为选项的结束。如果任何文件名以-;开头,这将避免错误。否则文件名可能被解释为一个选项

如果您需要避免匹配22, 23, 32, 33,您将需要更复杂的东西,例如??s???'s answer


Byt*_*der 8

您可以使用 shell glob:

rm *2* *3*
Run Code Online (Sandbox Code Playgroud)

这将删除当前工作目录中由*2**3*globs匹配的所有文件(不是目录)。

在这些 glob 中,“*始终表示“任何字符的任何数字(包括零)”。

但是请注意.,默认情况下IIRC Bash 的 glob 不匹配隐藏文件(文件名以 a 开头)。


Geo*_*sen 5

对于当前目录或任何其他位置:

  1. 运行此命令以查看要删除的内容:

    find . -type f -iname "*[32]*.wav" 
    
    Run Code Online (Sandbox Code Playgroud)
  2. 然后删除:

    find . -type f -iname "*[32]*.wav" -delete
    
    Run Code Online (Sandbox Code Playgroud)

更多信息:

  • . 表示当前目录,也可以是文件位置的路径,例如 /path/to/files
  • 要防止find移动到预期目标中的任何目录,请使用 option -maxdepth 1,因此:
    • find . -maxdepth 1 -type f -iname "*[32]*.wav" -delete
  • 如果在目标目录中,则使用:
    • find . -maxdepth 1 -type f -iname "*[32]*.wav" -delete

警告

永远不要这样做,find . -delete -type f -iname "*[32]*.wav"否则所有(您的文件)都将被删除!

  • 为什么不简单地用`-delete`代替`-exec rm {} \;`?无需为每个匹配的文件调用 `rm`。 (2认同)
  • 如果出于某种原因*确实*从`find`调用`rm`,最好使用`rm --`,这样文件名参数就不会被解释为选项。否则,有人可以将文件命名为类似 `-r` 的名称并造成麻烦...不过,`find` 的 `-delete` 操作几乎总是最好的方法。 (2认同)
  • +1 用于使用查找。分两步使用,第一步不带-delete,这样您就可以看到下一步要删除的内容。另外,请注意,如果您在 -type 和 -iname 选择器之前移动 -delete,您将删除所有内容。 (2认同)