Bash 查找文件并按日期和大小过滤
Bash find files and filter by date and size
我有一个目录,里面有很多文件。
每天都会自动添加新文件。
文件名的格式如下:
[GROUP_ID]_[RANDOM_NUMBER].txt
示例:012_1234.txt
对于每一天,对于每个 GROUP_ID(032、024、044...等),我只想保留当天最大的文件。
例如,对于 3 月 27 日和 28 日这两天,我有:
March 27 - 012_1234.txt - 12ko
March 27 - 012_0243.txt - 3000ko
March 27 - 016_5647.txt - 25ko
March 27 - 024_4354.txt - 20ko
March 27 - 032_8745.txt - 40ko
March 28 - 032_1254.txt - 16ko
March 28 - 036_0456.txt - 30ko
March 28 - 042_7645.txt - 500ko
March 28 - 042_2310.txt - 25ko
March 28 - 042_2125.txt - 34ko
March 28 - 044_4510.txt - 35ko
我想要:
March 27 - 012_0243.txt - 3000ko
March 27 - 016_5647.txt - 25ko
March 27 - 024_4354.txt - 20ko
March 27 - 032_8745.txt - 40ko
March 28 - 032_1254.txt - 16ko
March 28 - 036_0456.txt - 30ko
March 28 - 042_7645.txt - 500ko
March 28 - 044_4510.txt - 35ko
我找不到合适的 bash ls/find 命令来执行此操作,有人有想法吗?
通过这个命令,我可以显示每天最大的文件。
ls -l *.txt --time-style=+%s |
awk '{ = int(/86400); print}' |
sort -nk6,6 -nrk5,5 | sort -sunk6,6
但我想要每天每个 GROUP_ID 文件的最大文件。
所以,如果有一个文件为“012”group_id 文件,10ko,我想显示它,即使其他组 id 有更大的文件...
我自己找到了解决方案:
ls -l | tail -n+2 |
awk '{ split([=10=],var,"_"); group_id=var[5]; print [=10=]" "group_id }' |
sort -k9,9 -k5,5nr |
awk ' != x { print } { x = }'
这为我提供了每个 group_id 的最大文件,所以现在我只需添加以处理白天部分。
参考资料:
tail -n+2
:隐藏ls
命令输出的"total"部分
首先awk:获取group_id部分(012, 036...)并显示在原行($0)
之后
排序:按文件名和大小排序
取每个的最大尺寸group_id(awk在开头添加的第10列)
我有一个目录,里面有很多文件。 每天都会自动添加新文件。
文件名的格式如下: [GROUP_ID]_[RANDOM_NUMBER].txt 示例:012_1234.txt
对于每一天,对于每个 GROUP_ID(032、024、044...等),我只想保留当天最大的文件。
例如,对于 3 月 27 日和 28 日这两天,我有:
March 27 - 012_1234.txt - 12ko
March 27 - 012_0243.txt - 3000ko
March 27 - 016_5647.txt - 25ko
March 27 - 024_4354.txt - 20ko
March 27 - 032_8745.txt - 40ko
March 28 - 032_1254.txt - 16ko
March 28 - 036_0456.txt - 30ko
March 28 - 042_7645.txt - 500ko
March 28 - 042_2310.txt - 25ko
March 28 - 042_2125.txt - 34ko
March 28 - 044_4510.txt - 35ko
我想要:
March 27 - 012_0243.txt - 3000ko
March 27 - 016_5647.txt - 25ko
March 27 - 024_4354.txt - 20ko
March 27 - 032_8745.txt - 40ko
March 28 - 032_1254.txt - 16ko
March 28 - 036_0456.txt - 30ko
March 28 - 042_7645.txt - 500ko
March 28 - 044_4510.txt - 35ko
我找不到合适的 bash ls/find 命令来执行此操作,有人有想法吗?
通过这个命令,我可以显示每天最大的文件。
ls -l *.txt --time-style=+%s |
awk '{ = int(/86400); print}' |
sort -nk6,6 -nrk5,5 | sort -sunk6,6
但我想要每天每个 GROUP_ID 文件的最大文件。 所以,如果有一个文件为“012”group_id 文件,10ko,我想显示它,即使其他组 id 有更大的文件...
我自己找到了解决方案:
ls -l | tail -n+2 |
awk '{ split([=10=],var,"_"); group_id=var[5]; print [=10=]" "group_id }' |
sort -k9,9 -k5,5nr |
awk ' != x { print } { x = }'
这为我提供了每个 group_id 的最大文件,所以现在我只需添加以处理白天部分。
参考资料:
tail -n+2
:隐藏ls
命令输出的"total"部分
首先awk:获取group_id部分(012, 036...)并显示在原行($0)
之后排序:按文件名和大小排序
取每个的最大尺寸group_id(awk在开头添加的第10列)