获取最后打开的文件

时间:2015-03-29 01:27:40

标签: macos bash

输入文件:

wtf.txt|/Users/jaro/documents/inc/face/|
lol.txt|/Users/jaro/documents/inc/linked/|
lol.txt|/Users/jaro/documents/inc/twitter/|
lol.txt|/Users/jaro/documents/inc/face/|
wtf.txt|/Users/jaro/documents/inc/face/|
omg.txt|/Users/jaro/documents/inc/twitter/|
omg.txt|/Users/jaro/documents/inc/linked/|
wtf.txt|/Users/jaro/documents/inc/linked/|
lol.txt|/Users/jaro/documents/inc/twitter/|
wtf.txt|/Users/jaro/documents/inc/linked/|
lol.txt|/Users/jaro/documents/inc/face/|
omg.txt|/Users/jaro/documents/inc/twitter/|
omg.txt|/Users/jaro/documents/inc/face/|
wtf.txt|/Users/jaro/documents/inc/face/|
wtf.txt|/Users/jaro/documents/inc/twitter/|
omg.txt|/Users/jaro/documents/inc/linked/|
omg.txt|/Users/jaro/documents/inc/linked/|

输入文件是已打开文件的列表(打开文件表示1行文件)我想获取最后打开的文件

e.g。 :在dir / Users / jaro / documents / inc / face /

中获取最后打开的文件

输出:

wtf.txt

2 个答案:

答案 0 :(得分:1)

这将获取文件中的最后一行,其第二个字段是所需的文件夹名称,并打印第一个字段。

awk -F '\|' '$2 == "/Users/jaro/documents/inc/face/" { f=$1 }
  END { print f }' file

为了测试最近的文件是否也是现有文件,我将使用shell来反转tac的顺序并执行逻辑;跳过错误路径中的文件,以及不存在的文件,然后打印第一个成功并退出。

tac file |
while IFS='|' read -r basename path _; do
    case $path in "/Users/jaro/documents/inc/face") ;; *) continue;; esac
    test -e "$path/$basename" || continue
    echo "$basename"
    break
done |
grep .

最后的grep .是产生退出代码,反映命令是否成功 - 如果它打印了一个文件,它没关系;如果没有提取的文件存在,则返回错误。

以下是我的原始答案,基于对您的问题的合理但明显不正确的解释。

以下是从列表中查找具有最新修改时间的文件的快速尝试。我避免使用parsing ls,而是选择使用stat中正确的机器可解析输出。由于您的输入文件是面向行的,我假设没有文件名包含换行符,这简化了一些事情。

awk -F '\|' '$2 == "/Users/jaro/documents/inc/face/" { print $2 $1 }' file |
sort -u |
xargs stat -f '%m %N' |
sort -rn |
awk -F '/' '{ print $NF; exit(0) }'

第一个sort是删除任何重复项,以避免运行stat次数超过必要时间(可能是过早优化),每行stat前缀表示文件的修改时间自纪元以来的秒数,这有助于按年龄轻松进行数字排序,最终的Awk脚本整齐地组合head -n 1 | rev | cut -d / -f1 | rev,即从第一行输出中提取基本名称,然后退出。

如果有任何方法可以使用较不古怪的输入格式,那将是一种改进(可能也是你生活中的一般)。

stat的输出格式未正确标准化,但您的问题已标记为 ,所以我假设< del> GNU coreutils BSD stat。如果需要可移植性,可以查看find(但是在不同平台上可能过度和/或没有更好的标准化)或者编写一个小的Perl或Python脚本。 (好吧,Ruby也是,我想,但就个人而言,我会选择Perl。)

perl -F'\|' -lane '{ $t{$F[0]} = (stat($F[1].$F[0]))[10]
    if !defined $t{$F[0]} and $F[1] == "/Users/jaro/documents/inc/face/" }
  END { print ((sort { $t{$a} <=> $t{$b} } keys %t)[-1]) }' file

答案 1 :(得分:0)

atime - atime(访问时间)是上次访问文件数据的时间。例如,显示文件内容或执行shell脚本将更新文件atime。您可以使用atime命令

查看ls -lu

http://www.techtrunch.com/linux/ctime-mtime-atime-linux-timestamps

所以在你的情况下,会做到这一点。

ls -lu /Users/jaro/documents/inc/face/