我已删除了为澄清此问题而发布的类似帖子,因此这不是重复帖子。
我的 /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 及其子目录中任何位置的打开文件 - 请参阅OUTPUT
lsof 手册页的部分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