如何从目录中删除所有空文件?

Cei*_*ems 3 bash filenames wildcards

我不小心粘贴到 shell 中并创建了一堆空文件,这些文件全部命名为随机数。一次性消除所有这些的有效方法是什么?

目录下还有我需要的其他文件;它们中包含数字,但其中任何以数字开头的文件都是错误的。你能喜欢正则表达式删除吗?

nob*_*ody 7

您是说您要删除的文件是空的。删除这些文件的一种方法是仅删除空文件。这样,您就不会删除包含任何内容的文件。我相信这比按名称对它们进行分类更安全。从当前目录删除空文件的命令是:

\n
find ./ -size 0 -delete\n
Run Code Online (Sandbox Code Playgroud)\n

St\xc3\xa9phane Chazelas 贡献了建设性意见。更好的命令是:

\n
find ./ -maxdepth 1 -type f -size 0 -delete\n
Run Code Online (Sandbox Code Playgroud)\n

  • 这还会递归地删除子目录中的空文件(任何类型,包括目录,只要它们是空的)。请注意,“-delete”是一个非标准扩展(来自 BSD,也可在 GNU 中找到)。 (3认同)
  • 该目录的大小也需要为 0。在某些文件系统(如 ext4)上,不可能有大小为 0 的目录。 (2认同)

Sté*_*las 5

zsh

\n
rm -f -- *(.L0)\n
Run Code Online (Sandbox Code Playgroud)\n

将删除常规( .) 非隐藏空文件(L长度为 0)。

\n

bash或其他壳:

\n
zsh -c 'rm -f -- *(.L0)'\n
Run Code Online (Sandbox Code Playgroud)\n

要删除名称仅由 ASCII 十进制数字组成的文件\xc2\xb9:

\n
rm -f <->\n
Run Code Online (Sandbox Code Playgroud)\n

where<-><x-y>匹配某个范围内但没有界限的数字。同样,对于其他 shell,您可以使用zsh -c '...'.

\n

bash,您还可以执行以下操作:

\n
(shopt -s extglob failglob; rm -f +([0123456789])\n
Run Code Online (Sandbox Code Playgroud)\n

或者在ksh93

\n
rm -f ~(N)+([0123456789])\n
Run Code Online (Sandbox Code Playgroud)\n

您可以将两者结合起来(删除全数字的空常规文件):

\n
rm -f <->(.L0)\n
Run Code Online (Sandbox Code Playgroud)\n

对于 POSIX shell 和实用程序,等效的内容是:

\n
LC_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 的文件。

\n

LC_ALL=C确保0-9范围仅包括 0123456789,而且也许更重要的是,如果文件名编码的字符集与语言环境不同,则该命令可以正常工作。例如,如果没有它,在 GNUfind和 UTF-8 语言环境中,一个名为$'St\\xe9phane'St\xc3\xa9phane以 latin1 编码)的文件将被删除,而不是因为在其中找不到非数字(它仅由非数字组成),但因为它包含无法解码为字符的 0xe9 字节,所以*(匹配 0 个或多个字符)将无法匹配。

\n

zshglob 没有问题,因为不构成字符一部分的字节被视为某种形式的特殊字符,而使用 bash glob 和当前版本,bash当输入字符串无法解码为字符时,会切换到按字节匹配(使它的行为就像在 C 语言环境中一样)。

\n
\n

\xc2\xb9 这次不限于常规文件,还包括符号链接、fifos...目录类型的文件不会被删除,除非rm您传递该选项,否则不会删除目录-r

\n

\xc2\xb2 您还可以使用-size 0(其 512 字节单位的大小为 0),这也可以在这里工作,因为大小会向上舍入,因此大小为 1 字节的文件将被视为由 1 个 512 字节单位组成,如下所示就目前而言-size 0,但更一般而言,为了精确大小匹配,我建议使用该c后缀,-size 1例如不适用于大小为 512 的文件,而是用于大小为 1 到 512 的文件。用于-size 512c大小恰好为 512 的文件。zshLglob 限定符,默认单位是byte,而不是 512 字节单位。

\n