如何验证bash中的file2比file1更新?


51

我如何验证file2上次修改的时间file1

在此示例中,的perl修改时间比早stack。是否有bash或Linux命令可以根据修改时间比较这些文件?

-rw-r--r--    1 root     root         1577 Sep  7 22:55 stack
-rwxr-xr-x    1 root     root          626 Sep  7 23:10 perl

Answers:


51

在这里找到

for f in /abcd/xyz* do
   [ "$f" -nt /abcd/test.txt ] && echo "file f$ found" done

14
也是-ot“比…大”。
丹尼斯·威廉姆森

1
我想我刚刚遇到了一个问题。对于文件修改时间只有几秒钟的文件,根据这些测试,它们的使用期限“相同”。-nt和-ot都给出相同的结果(假)。在我的用例中,我有一个程序读取其他输出,并且我需要确保它们以正确的顺序运行。在这种情况下,似乎有必要比较纳秒。
sjmc

38
if [[ FILE1 -nt FILE2 ]]; then
  echo FILE1 is newer than FILE2
fi

取自“ man test ”。摘抄:

FILE1 -nt FILE2
  FILE1 is newer (modification date) than FILE2

7

另一种方法是:

find -name file2 -newer file1

如果file2较旧或与file1相同,则将返回null。如果更新,它将返回文件2的名称(和目录)。

请注意,Linux不会跟踪文件的创建时间。这些测试将针对最新的修改日期和时间。


2
Linux确实会跟踪创建时间:它称为ctime。它还会跟踪上次访问时间:atime。它通常只使用mtime,因为这是最后一次修改时间,这是最有用的。
Coroos

2
@Coroos:ctime不是创建时间。它是inode的更改时间,并在文件的属性(例如所有者或权限)发生更改时或在您修改文件时进行更新。一些文件系统支持出生时间,但内核不支持。Stat显示空的出生时间。请参阅unix.stackexchange.com/a/91200注意OS X支持出生时间stat -f %SB filename
Dennis Williamson

另请参阅htrp://unix.stackexchange.com/a/50184,以了解如何debugfs在Linux中使用它来查看创建(出生)时间。
丹尼斯·威廉姆森

2

如果需要更多详细信息,可以使用以下stat命令

<tbielawa>@(fridge)[~/SuperUser] 03:15:10
$ touch firstFile
<tbielawa>@(fridge)[~/SuperUser] 03:15:24
$ touch secondFile
<tbielawa>@(fridge)[~/SuperUser] 03:15:45
$ stat firstFile 
  File: `firstFile'
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: 805h/2053d  Inode: 151528      Links: 1
Access: (0644/-rw-r--r--)  Uid: (  500/tbielawa)   Gid: (  500/tbielawa)
Access: 2010-09-14 03:15:24.938721003 -0400
Modify: 2010-09-14 03:15:24.938721003 -0400
Change: 2010-09-14 03:15:24.938721003 -0400
<tbielawa>@(fridge)[~/SuperUser] 03:15:48
$ stat secondFile 
  File: `secondFile'
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: 805h/2053d  Inode: 151529      Links: 1
Access: (0644/-rw-r--r--)  Uid: (  500/tbielawa)   Gid: (  500/tbielawa)
Access: 2010-09-14 03:15:45.074722792 -0400
Modify: 2010-09-14 03:15:45.074722792 -0400
Change: 2010-09-14 03:15:45.074722792 -0400

2
echo $(($(date -r file1 +%s)-$(date -r file2 +%s)))
2208

如果结果> 0,则第一个文件较新。(相对于上次修改时间(而不是创建时间)而言较新,它存储在linux上)。


-nt通常更好,但这仍然是一个有用的职位...
BuvinJ

0

根据此链接,u​​nix不存储创建日期。 http://www.issociate.de/board/post/302628/How_to_check_file_creation_date.html

但是会存储最后访问权限。

最后访问

 ls -t  # displays in order of date. So the first one is the 

ls在新行中显示每个文件。

所以ls -t在第一行等上显示最新文件。

  • 您可以自己选择第一行。
  • 您可以使用sed选择第一行。

    ls -t php.exe php.ini | sed -n'1p'php.ini

可以做到,-lt 尽管您会看到如果您不指定任何文件..并且执行了目录..然后它在第一行给出了总数,因此您选择第二行就像$ls -lt | sed -n '2p'

一个好人是

ls -t | head -n 1

要么

ls -lt | head   

以顺序显示第一个文件的顺序显示前10行,您可以看到它是哪个


-t是修改时间;-u是访问时间
丹尼斯·威廉姆森

谢谢..我想知道-u ..的区别..是的,正如您所建议的.. -t和-u是按时间排序的。. 比说按日期排序要好。
barlop

虽然可能不如按日期/时间说的好;-)
barlop

0

这是我做的一个小脚本:

mtf0=`stat -c %Y file0`    
mtf1=`stat -c %Y file1`    
dt=$(( mtf1 - mtf0 ))    
[[ $dt -gt 0 ]] && echo "File F1 is newer than file F0 "

您应该更详细地解释该命令的一些引用在做什么,以便可能使用它的人们有机会阅读或了解您的分解,而不仅仅是证明命令和语法。
Pimp Juice IT
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.