删除除一种(或多种)文件类型之外的所有文件类型

删除除一种(或多种)文件类型之外的所有文件类型

我一直在尝试找到一个命令来删除文件夹中的所有文件,但不是删除某种文件类型。但我似乎没有什么运气。到目前为止我已经尝试过:

set extended_glob
rm !(*.dmg)
# this returns zsh:number expected

rm ./^*.dmg
# this returns no matches found 

我使用的 zsh 版本是zsh 5.0.2 (x86_64-apple-darwin13.0.1).

答案1

extended_glob选项为您提供 zsh 自己的扩展全局语法

setopt extended_glob
rm -- ^*.dmg
rm -- ^*.(dmg|txt)

这将删除没有扩展名的文件(例如README)。如果你想保留这些文件,你可以使用运算~符来限制匹配:

setopt extended_glob
rm -- *.*~*.dmg

如果您还想删除子目录中的文件,可以使用**用于递归通配符。通过. 全局限定符将匹配限制为常规文件,或使用^/而不是.匹配所有非目录(包括符号链接)。 (请注意,这对rm -r您没有帮助,因为它要么删除目录及其所有内容,要么根本不进入目录。)

rm -- **/^*.(dmg|txt)(.)

您可以设置ksh_glob获得的选项ksh 球体。请注意,在常见情况下,否定模式是单词中的最后一个事物,zsh 可能会将括号解析为 glob 限定符(它不会在 ksh 模拟模式下执行此操作)。

setopt ksh_glob
rm -- !(*.dmg|*.txt)
setopt no_bare_glob_qual
rm -- !(*.dmg)

答案2

您可以使用find以下命令来代替 shell:

find . -mindepth 1 -maxdepth 1 ! -name "*.dmg" -delete

man find

   ! expr True  if  expr  is false.  This character will also usually need
          protection from interpretation by the shell.
   -name pattern
          Base of file name (the path with the leading directories removed)
          matches shell pattern pattern. 
   -delete
          Delete  files; true if removal succeeded.  If the removal failed,
          an error message is issued.  If -delete fails, find's exit status
          will be nonzero (when  it eventually exits).  Use of -delete 
          automatically turns on the -depth option.

如果您出于某种原因无法使用find,可以使用以下方法zsh(或其他 shell)来完成此操作。zsh是的zsh,可能有一种更简单的方法可以做到这一点,但由于我是一个bash男人,这就是我想出的方法:

for file in *; do if [[ ! "$file" == *.dmg ]]; then rm $file; fi; done

答案3

删除文件的另一种方法是使用find,xargsrm

find . -mindepth 1 -maxdepth 1 ! -name '*.dmg' -print0 | xargs -0 rm

答案4

find  path -mindepth 1 -maxdepth 1 -type f ! -name "*.dmg" -exec rm -vf {} \;

相关内容