删除名称中没有字符串的文件

plr*_*plr 11 bash filenames rm macos

我想删除999名称中没有字符串的文件。

我试过了:

grep -vlr 999 . | xargs -0 rm -f --
find . -print0 | grep --null-data -v 999 | xargs -0 rm --
Run Code Online (Sandbox Code Playgroud)

但它们都不起作用。我正在使用 macOS Sierra 和 bash:3.2.57。

Kus*_*nda 21

在 中使用扩展的通配模式bash

rm ./!(*999*)
Run Code Online (Sandbox Code Playgroud)

这需要shopt -s extglob启用(并且为了安全起见,如果所有文件名都包含shopt -s failglob,则不会!(*999*)错误地删除具有异常名称的文件999)。该模式!(*999*)将匹配当前目录中的任何名称,除了那些匹配*999*.

要同时删除隐藏文件(名称以开头的文件),请使用 启用该dotglob选项shopt -s dotglob

只关心常规文件或常规文件的符号链接(而不是目录等):

for name in ./!(*999*); do [ -f "$name" ] && rm "$name"; done
Run Code Online (Sandbox Code Playgroud)

zsh与上述循环等效的外壳将是

rm ./(^(*999*))(.)
Run Code Online (Sandbox Code Playgroud)

您的第一个命令将不起作用,因为grep它将查看文件内部。它将删除所有没有行的文件999(是否添加了该--null选项以便与 一起使用xargs -0)。

您的第二个命令将不起作用,因为grepmacOS 不支持--null-data(但它确实有一个--null选项,但仅用于生成文件名输出时)。另请注意,它将查找999文件路径名中的任何位置(即包括任何目录组件),而不仅仅是文件名。


ilk*_*chu 18

只需反转名称条件find

find . -type f \! -name "*999*" 
Run Code Online (Sandbox Code Playgroud)

添加-delete-exec rm {} +实际删除匹配的文件。

  • `!` 在 `bash` 中是安全的。 (2认同)