如何删除目录下所有文件的内容

How to delete the contents of all the files in a directory

/tmp/REPORTS下我有一百个文件。我想做的是擦除 /tmp/REPORTS 中每个文件的内容(而不是删除它们)。所以我尝试了以下操作,但出现此错误:

cp /dev/null /tmp/REPORTS/*

cp: Target /tmp/REPORTS/…..  must be a directory
Usage: cp [-f] [-i] [-p] [-@] f1 f2
      cp [-f] [-i] [-p] [-@] f1 ... fn d1
      cp -r|-R [-H|-L|-P] [-f] [-i] [-p] [-@] d1 ... dn-1 dn

如何清除目录下所有文件的内容?


你可以使用这个
删除

find /tmp/REPORTS/ -type f -name "*.*" -exec rm -rf {} \;

或者将它们移动到你想要的地方 对于 cp

find /tmp/REPORTS/ -type f -name "*.*" -exec cp {} \tmp\{} \;

MV

find /tmp/REPORTS/ -type f -name "*.*" -exec mv {} \dev\null \;

假设您的意思是要截断每个文件的内容,您可以这样做:

for file in /tmp/REPORTS/*; do > "$file"; done

这将清除目录中每个文件的内容。

正如 gniourf_gniourf 在上面的评论中所建议的那样,有一个 GNU 工具 truncate 也可以为您完成这项工作:

truncate --size 0 /tmp/REPORTS/*

这可能比手动循环文件更快。

问题似乎是在询问所谓的 "secure erase"。

虽然您不能 cp /dev/null,但您可以使用 dd 获得您所询问的效果。这里有一个脚本来说明:

#!/bin/sh
for name in $*
do
    test -h "$name" && continue
    test -f "$name" || continue
    blocks=`ls -s "$name" | awk '{print ; }'`
    dd if=/dev/zero of="$name" count=$blocks
done

剧本

  • 检查以确保参数是一个常规文件。
  • 然后它会询问文件的块数
  • 最后,它使用dd从特殊设备/dev/zero复制0。

这依赖于 ddls 具有相同的块大小概念(看起来确实如此)。它还假定文件系统不会为给定文件重新分配块,即它们可以可靠地就地覆盖。如果你想要更好的保证,还有其他解决方案,例如 Secure Erase in UNIX

的讨论

试试这个:

$ find /tmp/REPORTS/ -type f -exec cat /dev/null > {} \;

或者如果您有大量文件,请尝试使用 \+ 而不是 \; 以获得更高效的命令行。