2017-10-11 26 views
0

我有文件的列表中选择一个时间列表可以包含:BASH:显示找到的所有文件,但不会持续2最新

1489247450-filename1 
1489248450-filename2 
1489249450-filename3 
1489249550-filename4 

和另一个时间:

1489249450-filename3 
1489249550-filename4 

和另一个时间:

1489245450-filename1 
1489246450-filename2 
1489247450-filename3 
1489248450-filename4 
1489249450-filename5 
1489249550-filename6 

该清单创建者:

find ./ -type f -name *filename* -exec stat --format="%X-%n" {} \; | sort 

我想选择所有的文件,但不是2个最新的。

我可以建立一个脚本,它可以计算所有文件并减去2,然后做| head。但有没有更简单的方法来做到这一点?

我想在只有2个最新的条件下删除旧文件。

我不想使用ctime,因为文件不是定期创建的。

+1

这可能是相关的:http://mywiki.wooledge.org/BashFAQ/003 –

+0

没有用的:( –

+0

这是令人惊讶的。此外,'ctime'不是文件创建时间,这是文件最后一次更改的时间。也许比'atime'更有用,考虑到[atime'甚至没有在某些发行版中立即更新](https://unix.stackexchange.com/a/8842/118235) –

回答

0

结果是非常简单的。

如果您想列出所有文件,但最新的3,你可以这样做:

find ./ -type f -name "*605*" -exec stat --format="%X-%n" {} \; | sort | head -n -3 

头-n -3是最主要的!

+1

'sort | head -n-3'与'sort -r |相同尾巴+ 3“。另外,如果你想使这个更强大并且处理包含换行符的文件名,你可以使用'--printf =“%X-%n \ 0”{} \; | sort -z | headn -zn -3'与空字符分开。 –

1

如果该列表是按照正确的顺序:

find ./ -type f -name *filename* -exec stat --format="%X-%n" {} \; | sort | tail +3 

否则:

find ./ -type f -name *filename* -exec stat --format="%X-%n" {} \; | sort -r | tail +3 
+0

你不知道有多少文件在那里,所以它没有用。 –

+0

我不明白你的观点。这个声明只会产生所有的结果,但是你不知道有多少个文件只有两个是不重要的,但是如果你想知道,可以将其传递给wc -l。 –

+0

啊,我在下面的回答中看到,你可能把“尾巴+3”误认为“尾巴-3”,并且在反对之前没有尝试过。是的 - “尾巴-3”只有在有五个文件时才会起作用(这会导致一个有效的反对意见,即“你不知道有多少文件存在”)。但“尾巴+3”的情况并非如此。 –

相关问题