无权删除 /tmp 内的文件

无权删除 /tmp 内的文件

我已删除了为澄清此问题而发布的类似帖子,因此这不是重复帖子。

我的 /tmp 文件夹中充满了随机文件。我的实际存储空间很好,但因为这些小文件多达数十万个,不久之后,由于文件数量庞大,我就会收到错误。

我尝试了各种选项,例如运行 cron 等,sudo rm file*但是在安装了 Midnight Commander 并尝试删除后,我收到了此通知:

“当您在非本地文件系统上时,shell 命令将不起作用”

那么,我如何获取本地文件?我一直尝试通过 Mac 上的终端命令行,然后我尝试通过 VMWare 进行所有相同的操作,但都没有成功。我尝试了直接使用 Linux 命令以及使用 Midnight Commander。使用纯 Linux 时,我没有遇到任何错误,也没有出现任何rm无法正常工作的迹象,直到我运行另一个ll命令并看到文件,所以至少我从 Midnight Commander 收到了上述提示。

我的权限设置与测试/开发服务器相同,该服务器与我遇到问题的实时服务器相同,但其 /tmp 文件夹是干净的。

答案1

首先,/tmp 目录的通常权限位是1777。前导1表示目录的粘着位已设置,这意味着尽管多个用户可以写入目录,但他们保留写入其中的任何文件的所有权,因此只有他们(或 root)可以删除它们。因此,如果没有,sudo您将只能从 /tmp 中删除自己的文件。此外,/tmp 中的某些文件可能被其他进程打开和/或锁定,除非您知道锁定已“过期”,否则您不应尝试删除它们 - 您可以使用lsof例如

$ sudo lsof +d /tmp

查看目录顶层的所有打开的文件,或者

$ sudo lsof +D /tmp

显示 /tmp 及其子目录中任何位置的打开文件 - 请参阅OUTPUTlsof 手册页的部分man lsof以了解各列的含义。

您可能面临的第二个问题是,尽管像 这样的命令rm可以接受多个文件名参数(包括扩展通配符或外壳全局变量),参数列表的长度是有限制的。例如,如果我们在/tmp

# touch /tmp/file{000000..099999}
# ls /tmp/file* | wc -l
100000

(到目前为止一切顺利)但如果我们再添加 100,000 个文件,扩展的 shell glob(即要删除的文件列表)对于ls命令行来说太长了

# touch /tmp/file{100000..199999}
# ls /tmp/file* | wc -l
-bash: /bin/ls: Argument list too long
0

同样,我们也不能一次性删除rm

# rm -f /tmp/file*
-bash: /bin/rm: Argument list too long

解决方案是将通配符列表分解为可管理的子集 - 您可以手动完成此操作,但可以使用以下xargs命令自动执行此操作,例如

# echo /tmp/file* | xargs rm -f

您还可以使用find带有-exec-execdir操作和{} +参数替换语法的命令 - 来自man find

-exec command {} +
              This  variant  of the -exec action runs the specified command on
              the selected files, but the command line is built  by  appending
              each  selected file name at the end; the total number of invoca-
              tions of the command will  be  much  less  than  the  number  of
              matched  files.   The command line is built in much the same way
              that xargs builds its command lines.  Only one instance of  `{}'
              is  allowed  within the command.  The command is executed in the
              starting directory.

例如

# find /tmp -maxdepth 1 -name 'file*' -type f -exec rm -f {} +

尽管xargs如果您只需要从顶层删除/tmp(即不从任何子目录删除),版本可能会更快。

如果目录继续填满,您确实应该调查哪些用户/进程正在创建文件以及原因。如果您更改了/tmp的权限,则应将其重置为1777

答案2

如果sudo rm -rf foldername不起作用则按照以下步骤操作

使用命令检查

which rm 

然后检查路径。在我的情况下,然后/bin/rm运行类似命令

/bin/rm -rf foldername

相关内容