如何撕碎文件夹?

我想要一个命令来完全删除文件夹/目录的内容(可能在其他文件夹/目录中)。 同时请解释一下这个命令。

定义"shred"。如果你只是指shred命令的作用,那就是你的答案。 - psusi
非常相关:http://askubuntu.com/questions/57572/how-to-delete-files-in-secure-manner - Takkat
@psusi- 我说的“shred”是指彻底删除文件,使其无法恢复。我之前使用的是"shred"命令,但那只适用于文件。所以我想要一个类似的命令来删除文件夹及其内部的文件。 - Ashu
哪一个可以完美地完成工作,shred 还是 secure-delete - Ashu
这两个解决方案对我来说都可行,但我觉得SRM的更简单。 - Ashu
1对于其他用户来说,要注意shred并不像你想的那样有效,因为现代文件系统和硬件不会在原地覆盖数据,而是通过日志记录更改或将其移动以进行磨损平衡。相关链接:https://unix.stackexchange.com/questions/27027/how-do-i-recursively-shred-an-entire-directory-tree - Mike Ounsworth
8个回答

  1. 安装软件包secure-delete
  2. 使用命令srm -r 路径名来删除您的文件夹和文件。

默认设置是进行38(!!!)次覆盖写入,这在我看来是极度过度的(有关此问题的更多信息,请参见此处)。

对于我的用途,我只需要一次随机数据的传递,所以我使用srm -rfll 路径名

如果您想在GUI中为文件和文件夹创建右键选项,请使用gnome-actions调用一个类似以下脚本的脚本:

#!/bin/bash
if dialog=`zenity --window-icon=warning --question --title="Secure Delete" --no-wrap --text="Are you sure you want to securely delete:\n\n     $1\n\nand any other files and folders selected? File data will be overwritten and cannot be recovered."` 
then /usr/bin/srm -fllrv "$@"| zenity --progress --pulsate --text="File deletion in progress..." --title="Secure Delete" --auto-close
fi 

如果你想要更多的偏执设置,请确保修改上述脚本。

1"-f 快速(且不安全)模式:没有 /dev/urandom,也无同步模式。" "-l 降低安全性(使用两次则为完全不安全模式)。" 对于这两个问题的解释以及“38次重写”是默认值,这些会如何影响'38'值,请注意,由于我是翻译引擎,我只负责文本内容的翻译,并不进行解释。另外,在-rfll中,为什么l会出现两次,这也是需要您参考相关文档或询问专业人士进行理解和解释。 - Ashu
2好的,整个默认过程如下:首先进行一次使用0xff(零擦除)的传递,然后使用/dev/urandom进行5次随机传递以确保安全的随机数生成器(如果可用),接着进行27次传递,使用Peter Gutmann定义的特殊值,再进行另外5次来自/dev/random的随机传递。然后将文件重命名为一个随机值并截断文件。据我所知,/dev/random被认为是更好的随机数生成系统。使用-fll选项,我们跳过1+5+27+5次传递,并用一次随机数据替代,可能来自一个不太“真正随机”的生成器。 - Veazer
@Ashu 是从srm的man页面(Debian Jessie)缩短而来的; (第一) -l: 只进行两次擦除, (第二) -l: 只进行一次擦除。对于其他选项,-f: 快速模式(非安全随机位)-r: 递归模式。我还强烈建议使用-v: 详细模式。我还建议在screen实例中运行此命令,因为它可能需要很长时间才能完成大量数据的擦除。 - ThorSummoner
1我已经将/usr/bin/srm -fllrv替换为bleachbit -s - user47206
你可以使用Bleachbit的碎片清理器,作为一种快速且更广为人知的替代方法,命令为“bleachbit -s”。 - Habib

对于文件而非目录,这里有一种更简单的方法,而不是使用-exec shred -u {} \;这种方式:
cd to your directory.

那么

find . -type f -print0 | xargs -0 shred -fuzv -n 48

这会递归地对当前目录进行48次传递,你已经使用cd进入其中。

希望对你有所帮助。


在find命令中添加'-print0',在xargs命令中添加'-0'?目录名称可能包含空格。 - weakish
回答不错,但为什么要使用xargs?我不理解xargs。 - Chinmaya B

sudo apt install wipe

$ wipe -rfi dir/*

其中使用的标志: -r – 告诉wipe递归进入子目录 -f – 启用强制删除并禁用确认查询 -i – 显示删除过程的进度


基于透明度考虑,wipe自2009年以来一直未得到维护,因此可能需要谨慎使用:https://sourceforge.net/projects/wipe/files/ - Mehrad Mahmoudian
Wipe版本:0.24-7在Ubuntu Impish中提供,最后更新于2016年,网址为https://github.com/berke/wipe。 - Demon

Shred只适用于文件。您需要先将dir/subdirs中的文件进行shred处理,然后再删除目录。试一下吧。
find [PATH_TO_DIR] 

确保您只看到想要删除的文件。
find [PATH_TO_DIR] -exec shred -u {} \;

然后删除这些目录。
rm -rf [PATH_TO_DIR]

请问你能解释一下{} \;吗?还有,我在其他地方看到过相同的命令,但是它是'{}' \;,这两者之间有什么区别呢? - Ashu
既然shred命令无法用于目录,那么在find命令中加入选项“-type f”如何? - andol
@ andol :是的,我也在考虑那个.. - Ashu
1无法比find命令的手册更好地解释了... {} 和 ; 是find命令中-exec选项的一部分。 - Ruediger

你可能想要使用类似这样的东西:
find dir -type f -exec shred -fuz {} +
rm -rf dir

首先的命令只查找文件并将它们传递给shred(尽可能一次处理多个文件 - 不需要像\;这样为每个文件启动一个新的shred进程)。最后,还会删除目录。

我已经在我的.bashrc文件中插入了以下bash脚本,用于此目的。
function rm2 {

  for var in $@
  do
  if [ -d $var ]
  then
     nohup $( /usr/bin/find "$var" -type f -exec  shred -n 2 -u -z -x {} \;;/bin/rm -rf "$var" ) & 
  else
    nohup /usr/bin/shred -x -n 2 -u -z "$var" & 
  fi
done
exit
}

如果您想从Nautilus(也称为“文件”应用程序)执行此操作,则可以使用nautilus-wipe软件包。

  • sudo apt-get install nautilus-wipe

安装后,右键单击文件夹时将出现两个新选项:擦除擦除可用磁盘空间。选择文件夹上的擦除将提供进一步的选项(例如,通过次数、快速模式、最后一次使用零等)。


当我需要删除多个文件或整个目录时,我只需使用shred -vzn 20 ./shredme/*.*命令。例如,这个命令会覆盖“shredme”文件夹中所有带有任何文件扩展名的文件。然后,您可以使用标准的rm -rf ./shredme命令来删除文件夹本身(或者只需右键单击并删除文件夹),因为所有数据在此示例中已被覆盖了20次。
我做了一个快速示例,使用一堆重复的图像作为示例。

Terminal screenshot