有没有更快的方法来删除目录,然后只需提交
rm -r -f *directory*
?我问这个是因为我们的日常跨平台构建非常庞大(例如每个构建4GB)。因此,某些机器上的硬盘经常耗尽空间。
这就是我们的AIX和Solaris平台的情况。
也许在这些平台上有删除目录的“特殊”命令?
PASTE-EDIT(将我自己的答案移到问题中):
我一般都在想为什么'rm -r -f'这么慢。不'rm'只需要修改'..'或'。'用于取消分配文件系统条目的文件。
就像是
mv *directory* /dev/null
会好的。
要从文件系统中删除目录,rm是您最快的选择。在linux上,有时我们在ramdisk中进行构建(几GB),它有一个非常令人印象深刻的删除速度:)你也可以尝试不同的文件系统,但在AIX / Solaris上你可能没有很多选项......
如果你的目标是让目录$ dir为空,你可以重命名它,稍后从后台/ cron作业中删除它:
mv "$dir" "$dir.old"
mkdir "$dir"
# later
rm -r -f "$dir.old"
另一个技巧是你为$ die创建一个单独的文件系统,当你想删除它时,你只需重新创建文件系统。像这样的东西:
# 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"
我不得不在Windows中删除超过3,00,000个文件。我安装了cygwin。幸运的是,我拥有数据库中的所有主目录。创建一个for循环并基于行输入和使用rm -rf删除
在将剩余部分复制到新的200 GB XFS卷之前,需要从AWS EBS 1 TB磁盘(ext3)上的数十个目录中删除700 GB。花费数小时将该体积保持在100%wa。由于磁盘IO和服务器时间不是免费的,因此每个目录只需要几分之一秒。
其中/ dev / sdb是任何大小的空卷
directory_to_delete = / EBS / var / tmp中/
mount / dev / sdb $ directory_to_delete
nohup rsync -avh / ebs / / ebs2 /
我编写了一个比rm更快的小型Java应用程序RdPro(递归目录清除工具)。它还可以删除用户在Linux / Unix和Windows的root.Works下指定的目标目录。它有命令行版本和GUI版本。
我只是在文件夹中使用find ./ -delete
来清空,它已经在10分钟内删除了620000目录(总大小)100GB。
资料来源:本站点https://www.slashroot.in/comment/1286#comment-1286的评论
我忘记了这个技巧的来源,但它有效:
EMPTYDIR=$(mktemp -d)
rsync -r --delete $EMPTYDIR/ dir_to_be_emptied/
至少在AIX上,您应该使用逻辑卷管理器LVM。我们所有的系统都将所有物理硬盘驱动器捆绑到一个卷组中,然后创建一个大的honkin'文件系统。
这样,您可以随意添加物理设备到您的计算机,并将文件系统的大小增加到您需要的任何内容。
我见过的另一个解决方案是在每个文件系统上分配一个垃圾目录,并使用mv
和find
cron
作业的组合来解决空间问题。
基本上,有一个cron
工作,每十分钟运行一次并执行:
rm -rf /trash/*
rm -rf /filesys1/trash/*
rm -rf /filesys2/trash/*
然后,当您希望回收该文件系统上的特定目录时,请使用以下内容:
mv /filesys1/overnight /filesys1/trash/overnight
并且,在接下来的十分钟内,您的磁盘空间将开始恢复。即使在删除已删除的版本之前,filesys1/overnight
目录也可立即使用。
垃圾邮件目录与您要删除的目录位于同一文件系统上非常重要,否则您手上有大量的复制/删除操作,而不是相对快速的移动。
如果rm -rf
很慢,也许你正在使用“同步”选项或类似的选项,它经常写入磁盘。在具有正常选项的Linux ext3上,rm -rf
非常快。
快速删除的一个选项可以在Linux上工作,也可能在各种Unixen上工作,就是使用循环设备,例如:
hole temp.img $[5*1024*1024*1024] # create a 5Gb "hole" file
mkfs.ext3 temp.img
mkdir -p mnt-temp
sudo mount temp.img mnt-temp -o loop
“漏洞”程序是我自己创建的一个程序,用于创建一个大的空文件,使用“空洞”而不是磁盘上分配的块,这要快得多,并且在您真正需要之前不会使用任何磁盘空间。 http://sam.nipl.net/coding/c-examples/hole.c
我只是注意到GNU coreutils包含一个类似的程序“truncate”,所以如果你有,你可以使用它来创建图像:
truncate --size=$[5*1024*1024*1024] temp.img
现在,您可以使用mnt-temp下的已安装映像进行临时存储,以进行构建。完成后,执行此操作将其删除:
sudo umount mnt-temp
rm test.img
rmdir mnt-temp
我想你会发现删除一个大文件要比删除大量的小文件快得多!
如果你不打算编译我的“hole.c”程序,你可以使用dd,但速度要慢得多:
dd if=/dev/zero of=temp.img bs=1024 count=$[5*1024*1024] # create a 5Gb allocated file
rm -r directory
通过在目录中重复深度优先,删除文件和删除目录来工作。它必须,因为您无法删除非空目录。
冗长乏味的细节:每个文件系统对象都由文件系统中的inode表示,该文件系统具有文件系统范围的平面inode数组。[1]如果您刚刚删除目录而没有先删除其子项,那么子项将保持分配状态,但没有任何指针。 (fsck
在运行时检查此类事物,因为它代表文件系统损坏。)
[1]对于那里的每个文件系统而言,这可能并不严格,并且可能存在按您描述的方式工作的文件系统。它可能需要类似垃圾收集器的东西。但是,我所知道的所有常见的fs对象都是由inode拥有的,而目录是名称/ inode编号对的列表。
我认为实际上只有“rm -rf”就像你引用删除目录一样。
为了避免一遍又一遍地手动执行,你可以每天cron一个脚本,如果它们“足够老”,可以递归删除构建根目录的所有构建目录,例如:
find <buildRootDir>/* -prune -mtime +4 -exec rm -rf {} \;
(这里mtime +4表示“任何超过4天的文件”)
另一种方法是配置你的构建器(如果它允许这样的东西)用当前的构建器粉碎前一个构建。
我也在研究这个问题。
我有一个600,000+文件的目录。
rm *会失败,因为条目太多了。
find . -exec rm {} \;
很好,每5秒删除〜750个文件。是通过另一个shell检查rm率。
所以,我写了一个简短的脚本,立即rm许多文件。每5秒获得约1000个文件。我们的想法是尽可能多地将文件放入1 rm命令中以提高效率。
#!/usr/bin/ksh
string="";
count=0;
for i in $(cat filelist);do
string="$string $i";
count=$(($count + 1));
if [[ $count -eq 40 ]];then
count=1;
rm $string
string="";
fi
done
使用perl -e'(<*>){((stat)[9] <(unlink))}'请参考以下链接:http://www.slashroot.in/which-is-the-fastest-method-to-delete-files-in-linux
在Solaris上,这是我找到的最快的方法。
find /dir/to/clean -type f|xargs rm
如果您有包含奇数路径的文件,请使用
find /dir/to/clean -type f|while read line; do echo "$line";done|xargs rm