我目前正在尝试删除一些文件。我想删除的文件包含数字 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
在此列表中,应该删除最后三个文件。
答案1
对于当前目录,您可以使用:
rm -- *[23]*
如果要限制它,仅匹配 2 或 3 必须出现在K
和之间的文件.wav
:
rm K*[23]*.wav
如果您想通过强制rm
要求确认每个文件来使其更安全,请使用-i
交互式标志:
rm -i K*[23]*.wav
###笔记
- shell glob
*
匹配任意数量(包括零个)的任意字符 - 对于 shell 来说
[some chars]
是一个字符类 - 里面的任何内容都可以匹配 --
被识别为rm
选项的结尾。这可以避免任何文件名以 开头时的错误-
;否则文件名可能会被解释为选项
如果你需要避免匹配,,,,22
你需要一些更复杂的东西,比如23
32
33
αғsнιη 的回答。
答案2
您可以使用 shell globs:
rm *2* *3*
*2*
这将删除当前工作目录中与或glob匹配的所有文件(不是目录)*3*
。
在这些全局变量中,“”*
始终表示“任意数量(包括零个)的任意字符”。
.
但请注意,IIRC Bash 的 glob默认不匹配隐藏文件(文件名以 开头)。
答案3
对于当前目录或任何其他位置:
运行此命令来查看要删除的内容:
find . -type f -iname "*[32]*.wav"
然后使用以下命令删除:
find . -type f -iname "*[32]*.wav" -delete
更多信息:
.
表示当前目录,也可以是文件位置的路径,例如/path/to/files
- 为了防止
find
移动到预期目标中的任何目录,请使用选项-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"
,否则所有(您的文件)都将被删除!
答案4
我是的粉丝xargs
,它允许在运行命令之前进行预览:
$ echo *2* *3*
(list of files with 2 or 3 in name)
这只是 shell glob 测试(在 bash 中有效),如果列表正确,则将其通过管道传输到 xargs:
$ echo *2* *3* | xargs rm -v
选项-v
列出rm
要删除的文件。您可以更加谨慎,并添加选项,-i
以便-v
每次删除时都会提示。