输入文件:
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
答案 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
的输出格式未正确标准化,但您的问题已标记为 linux osx ,所以我假设< 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/