考虑是否列出目录中的文件:
drwx--x--x 43 root wheel 4.0K Aug 18 12:52 ..
-rw------- 1 root root 268K Aug 18 04:31 build_locale_databases_log
-rw------- 1 root root 5.2M Aug 18 17:21 access_log
-rw------- 1 root root 85K Aug 18 17:14 cpbackup_transporter.log
-rw------- 1 root root 2.1M Aug 18 05:49 cphulkd.log
-rw------- 1 root root 3.2M Aug 18 17:19 error_log
-rw------- 1 root root 1.7M Aug 18 12:52 license_log
这里我想清除大于的文件内容2Mb
。 (即)使以下文件的文件大小为零字节:
access_log
cphulkd.log
error_log
答案1
我喜欢先回答直接的问题,但是在阅读完我的答案之前不要运行此命令。您要求的命令(可能不是您想要的)是:
find /wherever -type f -name '*.log' -size +4096 -print \
| xargs truncate --size 0
请注意,+4096 表示文件的扇区数超过 4096 个 512 字节。问题是,如果这些是进程正在主动写入的日志文件,那么这些进程将保留其在文件中的位置。您将恢复磁盘空间(假设您的文件系统支持稀疏文件,大多数文件系统都支持),但是当您查看日志时,开头会出现零块。因此,您确实需要在执行此操作后立即重新启动守护进程,或者最好将文件移开并重新启动守护进程:
cd /wherever
find . -name '*.log' -maxdepth 1 -size +4096 -exec mv {} {}.old \;
systemctl restart yourservice (or whatever you need to restart)
rm -f *.old
答案2
您可以通过 find 命令来完成此操作:
for i in $(find . -type f -size +2097152c);do cat /dev/null > $i;done
find 命令find . -type f -size +2097152c
将查找所有大小大于的文件
2MB(2097152 字节)
for 循环将循环到 find 命令中获得的文件列表,并使用cat /dev/null
- - - 编辑 - - -
根据 user3188445 的建议,您也可以尝试这种方式
for i in $(find . -type f -size +2097152c);do : > $i;done
答案3
正确:
find . ! -name . -prune -type f -size +2097152c -exec sh -c '
for f do
: > "$f"
done
' sh {} +
使用 GNU find 或 BSD find:
find . -maxdepth 1 -type f -size +2M ...
答案4
我想出了:
find . -type f -size '+2M' -print | while read i
do
echo " " > $i
done
这有效。