删除文件内容但保留名称和层次结构

删除文件内容但保留名称和层次结构

我已经镜像了目录结构,但我不关心文件的内容,我只想保留所有内容的名称和结构。

如何将所有文件(不是文件夹)内容替换为“无”(空、1 字节、空字符串或类似内容)?

答案1

一般来说,

find /top -type f -exec cp /dev/null {} \;

或(由约旦):

find /top -type f -exec sh -c '> $1' -- {} \; 

在 Linux 系统(或带有截断命令来自GNU coreutils 包):

find /top -type f -exec truncate -s 0 {} +

答案2

zsh

for f (**/*(D.)) : > $f

.仅对常规文件执行此操作,D包括隐藏文件和隐藏目录中的文件。

对于少量文件,您可以将其缩短为:>**/*(D.).

要保持文件大小相同,但使它们稀疏且没有数据(因此除了不支持稀疏文件的 Apple HFS+ 文件系统外,在磁盘上不占用任何空间):

find . -type f -exec perl -e '
  for (@ARGV) {
    unless (open F, "+<", $_) {warn "open $_: $!"; next}
    unless (seek F, 0, 2) {warn "seek $_: $!"; next}
    $size = tell F;
    unless (truncate F, 0) {warn "zap $_: $!"; next}
    unless (truncate F, $size) {warn "fill $_: $!"; next}
  }' {} +

请注意,所有这些都会更新文件的上次修改时间。

答案3

如果您想保留文件的所有元数据,我建议执行以下操作:

  • 首先使用以下命令归档文件的元数据:

    star -c -dump -meta $STARTDIR > out.tar

  • 然后调用find删除文件。

Star 允许您extract通过调用以下方式从这样的 tar 存档中获取元数据:

star -xp -xmeta < out.tar

这将创建一个目录树,它看起来像原始树,但所有普通文件的大小均为 0。

如果您致电:

star -xp -xmeta -force-hole < out.tar

这些文件都是稀疏文件,没有内容,但文件大小正确。

star请注意,当您必须向软件作者报告问题并且该问题仅发生在特定文件树上并且您不希望泄露文件内容时,该方法也可能很有趣。

答案4

为了完整起见,这里使用 bash 版本:

for f in **; do [ -f "$f" ] && [ ! -L "$f" ] && >"$f"; done

这需要globstar启用选项 ( shopt -s globstar),因此至少需要 bash 版本 4。(但如果您要使用它,zsh您可能也不想坚持使用默认的 Mac OS X 版本。)

相关内容