Cei*_*ems 3 bash filenames wildcards
我不小心粘贴到 shell 中并创建了一堆空文件,这些文件全部命名为随机数。一次性消除所有这些的有效方法是什么?
目录下还有我需要的其他文件;它们中包含数字,但其中任何以数字开头的文件都是错误的。你能喜欢正则表达式删除吗?
您是说您要删除的文件是空的。删除这些文件的一种方法是仅删除空文件。这样,您就不会删除包含任何内容的文件。我相信这比按名称对它们进行分类更安全。从当前目录删除空文件的命令是:
\nfind ./ -size 0 -delete\n
Run Code Online (Sandbox Code Playgroud)\nSt\xc3\xa9phane Chazelas 贡献了建设性意见。更好的命令是:
\nfind ./ -maxdepth 1 -type f -size 0 -delete\n
Run Code Online (Sandbox Code Playgroud)\n
和zsh
:
rm -f -- *(.L0)\n
Run Code Online (Sandbox Code Playgroud)\n将删除常规( .
) 非隐藏空文件(L
长度为 0)。
在bash
或其他壳:
zsh -c 'rm -f -- *(.L0)'\n
Run Code Online (Sandbox Code Playgroud)\n要删除名称仅由 ASCII 十进制数字组成的文件\xc2\xb9:
\nrm -f <->\n
Run Code Online (Sandbox Code Playgroud)\nwhere<->
是<x-y>
匹配某个范围内但没有界限的数字。同样,对于其他 shell,您可以使用zsh -c '...'
.
在bash
,您还可以执行以下操作:
(shopt -s extglob failglob; rm -f +([0123456789])\n
Run Code Online (Sandbox Code Playgroud)\n或者在ksh93
:
rm -f ~(N)+([0123456789])\n
Run Code Online (Sandbox Code Playgroud)\n您可以将两者结合起来(删除全数字的空常规文件):
\nrm -f <->(.L0)\n
Run Code Online (Sandbox Code Playgroud)\n对于 POSIX shell 和实用程序,等效的内容是:
\nLC_ALL=C find . ! -name . -prune -type f -size 0c \\\n ! -name '*[!0-9]*' -exec rm -f {} +\n
Run Code Online (Sandbox Code Playgroud)\n要查找全数字文件,我们会查找除包含至少一位非数字的文件之外的所有文件。-size 0c
匹配大小以字节为单位的文件为 0 的文件。
LC_ALL=C
确保0-9
范围仅包括 0123456789,而且也许更重要的是,如果文件名编码的字符集与语言环境不同,则该命令可以正常工作。例如,如果没有它,在 GNUfind
和 UTF-8 语言环境中,一个名为$'St\\xe9phane'
(St\xc3\xa9phane
以 latin1 编码)的文件将被删除,而不是因为在其中找不到非数字(它仅由非数字组成),但因为它包含无法解码为字符的 0xe9 字节,所以*
(匹配 0 个或多个字符)将无法匹配。
zsh
glob 没有问题,因为不构成字符一部分的字节被视为某种形式的特殊字符,而使用 bash glob 和当前版本,bash
当输入字符串无法解码为字符时,会切换到按字节匹配(使它的行为就像在 C 语言环境中一样)。
\xc2\xb9 这次不限于常规文件,还包括符号链接、fifos...目录类型的文件不会被删除,除非rm
您传递该选项,否则不会删除目录-r
。
\xc2\xb2 您还可以使用-size 0
(其 512 字节单位的大小为 0),这也可以在这里工作,因为大小会向上舍入,因此大小为 1 字节的文件将被视为由 1 个 512 字节单位组成,如下所示就目前而言-size 0
,但更一般而言,为了精确大小匹配,我建议使用该c
后缀,-size 1
例如不适用于大小为 512 的文件,而是用于大小为 1 到 512 的文件。用于-size 512c
大小恰好为 512 的文件。zsh
的L
glob 限定符,默认单位是byte,而不是 512 字节单位。