在Linux或Unix上如何删除文件名中包含字符或数字/数字的文件

时间:2020-01-09 14:17:03  来源:igfitidea点击:

在Linux或Unix bash shell提示符下,如何删除文件名中包含字符a或z或文件名中包含数字(例如4或2)的文件?
您需要使用rm命令删除命令行上指定的文件。
您需要使用称为globbing(通配符)的bash特殊功能来扩展文件名。

请注意,通配符模式不是正则表达式。
它们匹配并处理文件名,而不是文本。

Bash Shell支持以下通配符:

  • *: 匹配任何字符串
  • *a*: 匹配任何包含a的字符串
  • *9*: 匹配任何包含数字9的字符串
  • *.[xy]: 匹配任何以.x或.y结尾的字符串
  • *[ab]*: 匹配包含字符a或b的任何字符串
  • *[42]*: 匹配包含数字4或2的任何字符串
  • ?: 匹配任何单个字符

例子

让我们考虑以下文件:

$ ls -l

输出示例:

total 0
-rw-r--r--  1 veryv  wheel  0 Aug 24 01:37 001
-rw-r--r--  1 veryv  wheel  0 Aug 24 01:37 002
-rw-r--r--  1 veryv  wheel  0 Aug 24 01:39 1.txt
-rw-r--r--  1 veryv  wheel  0 Aug 24 01:37 13
-rw-r--r--  1 veryv  wheel  0 Aug 24 01:37 13aa
-rw-r--r--  1 veryv  wheel  0 Aug 24 01:37 42
-rw-r--r--  1 veryv  wheel  0 Aug 24 01:37 4213aa
-rw-r--r--  1 veryv  wheel  0 Aug 24 01:42 A.txt
-rw-r--r--  1 veryv  wheel  0 Aug 24 01:22 bar
-rw-r--r--  1 veryv  wheel  0 Aug 24 01:39 c.txt
-rw-r--r--  1 veryv  wheel  0 Aug 24 01:37 cd4213aa
-rw-r--r--  1 veryv  wheel  0 Aug 24 01:37 file2.txt
-rw-r--r--  1 veryv  wheel  0 Aug 24 01:37 file4.txt
-rw-r--r--  1 veryv  wheel  0 Aug 24 01:37 file40.txt
-rw-r--r--  1 veryv  wheel  0 Aug 24 01:22 foo
-rw-r--r--  1 veryv  wheel  0 Aug 24 01:22 raj
-rw-r--r--  1 veryv  wheel  0 Aug 24 01:22 sai
-rw-r--r--  1 veryv  wheel  0 Aug 24 01:22 Hyman

要列出所有.txt文件,请运行:

$ ls *.txt
`1.txt c.txt file2.txt file4.txt file40.txt`

查看带有1个字符名称的txt文件(例如z.txt,3.txt)

$ ls ?.txt
`1.txt c.txt`

列出以大写字母开头的txt文件:

$ ls [A-Z]*.txt
`A.txt`

您能猜出以下命令做什么吗?

$ ls [A-Za-z]*.txt
`A.txt c.txt file2.txt file4.txt file40.txt`

您可以对任何Linux/Unix命令(例如rm命令,cp命令,mv命令,tar命令等)使用通配符。
要删除文件名中包含数字4或2的文件:

$ ls *[42]*
$ rm -v *[42]*

限制为.jpg扩展名:

$ ls *[42]*.jpg
$ rm -v *[42]*.jpg

另一个示例,文件名以大写的X开头,以.JPG扩展名结尾,并且文件名中包含数字4或2的文件:

$ ls X*[42]*.jpg
$ rm -v X*[42]*.jpg

关于选项的说明,该选项会更改bash shell的通配行为

通过运行以下shopt命令打开extglob:

$ shopt -s extglob

从bash手册页:

Composite patterns may be formed using one or more of the following sub-patterns:
 
      ?(pattern-list)
               Matches zero or one occurrence of the given patterns
      *(pattern-list)
               Matches zero or more occurrences of the given patterns
      +(pattern-list)
               Matches one or more occurrences of the given patterns
       @(pattern-list)
               Matches one of the given patterns
       !(pattern-list)
               Matches anything except one of the given patterns

要查看以foo或bar开头的所有mp4和mov文件:

$ ls +(foo|bar)*+(.mp4|.mov)

要列出除* .mp4匹配的文件以外的所有文件,请执行以下操作:

$ ls -l !(*.mp4)

或删除除与* .gif文件匹配的文件以外的所有文件:

$ rm -v !(*.gif)