列出所有比给定时间戳更新的文件并对它们进行排序


8

我只想列出目录/ tmp 中格式比时间戳新的所有文件(按日期排序)20130207003851。子目录可以省略。

使用SUSE Linux Enterprise Server 11。

输出格式应为

S0002948.LOG Feb  7 03:28 
S0002935.LOG Feb  7 05:58 
S0002952.LOG Feb  7 09:58 
S0002940.LOG Feb  7 11:58 

找到/ tmp -newermt“ 2013年2月7日” -ls列出了我想要的文件,但是

  • 如何使用格式20130207003851的时间戳
  • 如何排序输出?
  • 如何只显示文件名和日期。首先是文件名,然后是日期?

ps我不想使用touch创建参考文件以进行查找

pss

find -newermt "20130207003851" -ls
find: I cannot figure out how to interpret `20130207003851' as a date or time

什么是2013007000385应该代表什么?我想2013年是这一年,但是您要如何从0070003852月7日开始呢?
吉尔(Gilles)'所以

@吉尔斯:应该是20130207003851。没有正确复制它或...对此表示抱歉。
Radek

Answers:


10

find支持很多日期输入格式。最简单的格式是YYYYMMDD HH:MM:SS。您已经按正确的顺序排列了数字,您所要做的就是提取第一个组(${timestamp%??????}:除最后6个字符外的${timestamp#????????}所有字符;:除前8个字符外的所有字符),然后继续,先添加标点符号,再添加下一组随着你的前进。

timestamp=20130207003851
timestring=${timestamp%??????}; timestamp=${timestamp#????????}
timestring="$timestring ${timestamp%????}"; timestamp=${timestamp#??}
timestring="$timestring:${timestamp%??}:${timestamp#??}"

在bash(以及ksh和zsh)中,但不在ash中,可以使用更具可读性的${STRING_VARIABLE:OFFSET:LENGTH}构造。

timestring="${timestamp:0:8} ${timestamp:8:2}:${timestamp:10:2}:${timestamp:12:2}"

要按日期对文件进行排序,请先打印出文件名,然后再进行日期排序,然后去除日期前缀。使用-printf控制输出格式。打印由决定的部分修改时间;如果是,则获得自Unix时代以来的秒数。在下面,我打印了三个制表符分隔的列:可排序格式的时间,文件名和人类可读格式的时间;删除第一列,并调用以足够的空间替换选项卡以容纳所有预期的文件名(根据需要调整40)。此代码假定文件名中没有换行符或选项卡。%TXXX@cut -f 2-expand

find -maxdepth 1 -type f \
     -newermt "$timestring" -printf '%T@\t%f\t%Tb %Td %TH:%TM\n' |
sort -k1n |
cut -f 2- |
expand -t 40

只有发现部分find -newermt "$timestring" -printf '%M@\t%f %Mb %Md %MH:%MM\n'给了我有趣的输出-rwxrwxrwx@ S0002975.LOG -rwxrwxrwxb -rwxrwxrwxd -rwxrwxrwxH:-rwxrwxrwxM
Radek

@Radek对不起,这是%Tmtime %M的权限。
吉尔斯(Gilles)'所以别再邪恶了'

美丽。工作顺利。我的最终代码是find /tmp -maxdepth 1 -type f -newermt "20130207 00:38:51" -printf '%T@\t%f-%Tb %Td %TH:%TM\n' | sort -k1n | cut -f 2-我用文件名和时间分开,-因为我将捕获php中的输出并使用-作为分隔符。非常感谢。
Radek

@Gilles它的真棒,但如果你解释TIMESTRING,这将有助于更多..
拉胡尔·帕蒂尔

@RahulPatil完成。我还添加了一个更具可读性的bash方法。
吉尔斯(Gilles)'所以

5

zsh

zmodload zsh/stat
newer() {
  local t
  zstat -A t -F %Y%m%d%H%M%S +mtime -- $REPLY && (( t >= timestamp ))
}
timestamp=20130207003851
print -rl -- /tmp/*(D.Om+newer)

newer对于比以下版本新的文件,该函数返回true $timestamp(请注意,zshzstat不支持亚秒级精度)。

然后,我们要做的就是使用zsh遍历修饰符:D包括点文件,.仅考虑常规文件,Om按修改时间排序以及+newer调用newer函数来确定要选择哪个文件。

如果还要显示文件时间戳,则可以更改newer为:

newer() {
  local t
  zstat -A t -F %Y%m%d%H%M%S +mtime -- $REPLY &&
    REPLY+=$'\t'$t &&
    (( t >= timestamp ))
}

请注意,尽管文件名生成的结果将包含时间戳,这意味着您不能再将它们用作文件名。


例如,这将ssh无法解决。
evandrix
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.