Sudesh Lakmal Pathirana Asked: 2019-11-15 00:15:43 +0800 CST2019-11-15 00:15:43 +0800 CST 2019-11-15 00:15:43 +0800 CST 用于删除最旧文件但保留最新文件(包括子目录)的 Bash 脚本 772 我正在尝试删除旧文件,但应保留最近 3 天的日志文件。我尝试了以下命令, ls -tr /home/httpd/htdocs/pathname/pathname/config/ /build/logs/apps/ .log | 尾-n +4 | xargs rm -- 但它被删除了所有文件一个文件夹只保留3个文件。但我想每个文件夹分别保留3个文件。 谁能帮我解决这个问题。 shell ls 2 个回答 Voted harrymc 2019-11-15T00:59:23+08:002019-11-15T00:59:23+08:00 你可以使用这个命令: ls -t path | sed -e '1,3d' | xargs -d '\n' rm 或者在一个循环中: for d in $(find path -type d); do ls -t "$d" | sed -e '1,3d' | xargs -d '\n' rm done 在哪里: ls -t: 按修改时间降序列出文件,每行一个文件名。 sed -e '1,3d': 删除前 3 行 xargs -d '\n' rm: 对于每个输入行(没有终止换行符),将其作为参数传递给rm. -d '\n':这是提高效率所必需的,使 xargs 将每个输入行视为一个单独的参数,但同时传递尽可能多的参数以适合命令行,因此不会为每个参数重新调用 rm。 有关更多可能性,请参阅帖子 Delete all but the most recent X files in bash。 Best Answer Lane Ouyang 2019-11-15T01:10:55+08:002019-11-15T01:10:55+08:00 你可以试试这个,把下面的内容放到一个shell脚本文件中执行。 #!/bin/bash dirs=($(find /tmp/test -type d)) for dir in "${dirs[@]}"; do cd "$dir" ls -pt | grep -v / | tail -n +4 | xargs rm -f done 替换/tmp/test为您的目录名称。
你可以使用这个命令:
或者在一个循环中:
在哪里:
ls -t
: 按修改时间降序列出文件,每行一个文件名。sed -e '1,3d'
: 删除前 3 行xargs -d '\n' rm
: 对于每个输入行(没有终止换行符),将其作为参数传递给rm
.-d '\n'
:这是提高效率所必需的,使 xargs 将每个输入行视为一个单独的参数,但同时传递尽可能多的参数以适合命令行,因此不会为每个参数重新调用 rm。有关更多可能性,请参阅帖子 Delete all but the most recent X files in bash。
你可以试试这个,把下面的内容放到一个shell脚本文件中执行。
替换
/tmp/test
为您的目录名称。