有没有更快的方法来删除目录,然后只需提交
rm -r -f *directory*
Run Code Online (Sandbox Code Playgroud)
?我问这个是因为我们的日常跨平台构建非常庞大(例如每个构建4GB).因此,某些机器上的硬盘经常耗尽空间.
这就是我们的AIX和Solaris平台的情况.
也许在这些平台上有删除目录的"特殊"命令?
PASTE-EDIT(将我自己的答案移到问题中):
我一般都在想为什么'rm -r -f'这么慢.不'rm'只需要修改'..'或'.' 用于取消分配文件系统条目的文件.
就像是
mv *directory* /dev/null
Run Code Online (Sandbox Code Playgroud)
会好的.
Bal*_*sár 23
要从文件系统中删除目录,rm是您最快的选择.在linux上,有时我们在ramdisk中进行构建(几GB),它有一个非常令人印象深刻的删除速度:)你也可以尝试不同的文件系统,但在AIX/Solaris上你可能没有很多选项......
如果你的目标是让目录$ DIR空现在,你可以将其重命名,并从后台/ cron作业后删除它:
mv "$dir" "$dir.old"
mkdir "$dir"
# later
rm -r -f "$dir.old"
Run Code Online (Sandbox Code Playgroud)
另一个技巧是你为$ dir创建一个单独的文件系统,当你想要删除它时,你只需重新创建文件系统.像这样的东西:
# initialization
mkfs.something /dev/device
mount /dev/device "$dir"
# when you want to delete it:
umount "$dir"
# re-init
mkfs.something /dev/device
mount /dev/device "$dir"
Run Code Online (Sandbox Code Playgroud)
yeg*_*gle 18
我忘记了这个技巧的来源,但它有效:
EMPTYDIR=$(mktemp -d)
rsync -r --delete $EMPTYDIR/ dir_to_be_emptied/
Run Code Online (Sandbox Code Playgroud)
rm -r directory其工作原理是通过目录深度优先向下递归,删除文件,并在备份过程中删除目录。它必须这样做,因为您无法删除不为空的目录。
又长又无聊的细节:每个文件系统对象都由文件系统中的一个 inode 表示,该 inode 具有文件系统范围内的平面 inode 数组。 [1] 如果您只是删除目录而没有先删除其子目录,那么子目录将保持分配状态,但没有任何指向它们的指针。(fsck在运行时检查此类情况,因为它代表文件系统损坏。)
[1] 对于每个文件系统来说,这可能并不完全正确,并且可能有一个文件系统按照您所描述的方式工作。它可能需要诸如垃圾收集器之类的东西。然而,我所知道的所有常见的行为如fs 对象都由 inode 拥有,目录是名称/inode 编号对的列表。
至少在AIX上,您应该使用逻辑卷管理器LVM.我们所有的系统都将所有物理硬盘驱动器捆绑到一个卷组中,然后创建一个大的honkin'文件系统.
这样,您可以随意添加物理设备到您的计算机,并将文件系统的大小增加到您需要的任何内容.
我见过的另一个解决方案是在每个文件系统上分配一个垃圾目录,并使用mv和find cron作业的组合来解决空间问题.
基本上,有一个cron每十分钟运行一次并执行的工作:
rm -rf /trash/*
rm -rf /filesys1/trash/*
rm -rf /filesys2/trash/*
Run Code Online (Sandbox Code Playgroud)
然后,当您希望回收该文件系统上的特定目录时,请使用以下内容:
mv /filesys1/overnight /filesys1/trash/overnight
Run Code Online (Sandbox Code Playgroud)
并且,在接下来的十分钟内,您的磁盘空间将开始恢复.filesys1/overnight即使在删除已删除的版本之前,该目录也将立即可用.
垃圾邮件目录与您要删除的目录位于同一文件系统上非常重要,否则您手上有大量的复制/删除操作,而不是相对快速的移动.
| 归档时间: |
|
| 查看次数: |
39264 次 |
| 最近记录: |