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
)。
您的第二个命令将不起作用,因为grep
macOS 不支持--null-data
(但它确实有一个--null
选项,但仅用于生成文件名输出时)。另请注意,它将查找999
文件路径名中的任何位置(即包括任何目录组件),而不仅仅是文件名。
ilk*_*chu 18
只需反转名称条件find
:
find . -type f \! -name "*999*"
Run Code Online (Sandbox Code Playgroud)
添加-delete
或-exec rm {} +
实际删除匹配的文件。