在/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
如何清除目录中所有文件的内容?
答案 0 :(得分:2)
假设您想要截断每个文件的内容,可以执行以下操作:
for file in /tmp/REPORTS/*; do > "$file"; done
这将清除目录中每个文件的内容。
正如gniourf_gniourf在上面的评论中所建议的那样,有一个GNU工具truncate
也可以为你完成这项工作:
truncate --size 0 /tmp/REPORTS/*
这可能比手动循环文件更快。
答案 1 :(得分:1)
问题似乎是要求所谓的"安全擦除"。
虽然您不能cp /dev/null
,但您可以获得有关使用dd
的效果。这是一个用来说明的脚本:
#!/bin/sh
for name in $*
do
test -h "$name" && continue
test -f "$name" || continue
blocks=`ls -s "$name" | awk '{print $1; }'`
dd if=/dev/zero of="$name" count=$blocks
done
脚本
dd
从特殊设备/dev/zero
复制0。这取决于dd
和ls
具有相同的blocksize概念(似乎是这种情况)。它还假定文件系统不重新分配给定文件的块,即它们可以被可靠地就地覆盖。如果您想要更好的保证,还有其他解决方案,例如Secure Erase in UNIX
答案 2 :(得分:0)
你可以用这个
删除
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 \;
答案 3 :(得分:0)
请改为尝试:
$ find /tmp/REPORTS/ -type f -exec cat /dev/null > {} \;
如果您有大量文件,请尝试使用\+
代替\;
以获得更有效的命令行。