我一直在尝试找到一个命令来删除文件夹中的所有文件,但不是删除某种文件类型。但我似乎没有什么运气。到目前为止我已经尝试过:
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
,xargs
和rm
:
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 {} \;