Как проверить, что file2 новее, чем file1 в bash?

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
Lidia
источник

Ответы:

51

Нашел здесь

for f in /abcd/xyz* do
   [ "$f" -nt /abcd/test.txt ] && echo "file f$ found" done
subanki
источник
14
Также -ot"старше чем".
Деннис Уильямсон
1
Я думаю, что я только что столкнулся с проблемой с этим. Для файлов с одинаковым временем модификации вплоть до секунд они имеют «одинаковый» возраст по данным тестам; и -nt и -ot дают одинаковый результат (false). В моем случае использования одна программа считывает вывод других, и мне нужно убедиться, что они работают в правильном порядке. В этом случае представляется необходимым сравнить наносекунды.
sjmc
38
if [[ FILE1 -nt FILE2 ]]; then
  echo FILE1 is newer than FILE2
fi

Взято из « мужского теста ». Выдержка:

FILE1 -nt FILE2
  FILE1 is newer (modification date) than FILE2
Эдди Паркер
источник
7

Еще один способ сделать это:

find -name file2 -newer file1

вернет ноль, если file2 старше или того же возраста, что и file1. Он вернет имя (и каталог) file2, если он более новый.

Имейте в виду, что Linux не отслеживает, когда были созданы файлы. Эти тесты будут для самой последней даты и времени модификации.

Деннис Уильямсон
источник
2
Linux отслеживает время создания: это называется ctime. Он также отслеживает последнее время доступа: atime. Он просто использует mtime, так как это время последнего изменения, которое наиболее полезно.
Coroos
2
@Coroos: ctimeне время создания. Это время изменения inode, которое обновляется, когда атрибуты файла, такие как владелец или права доступа, изменяются или когда вы изменяете файл. Некоторые файловые системы поддерживают время рождения, а ядро ​​- нет. Стат показывает пустое время рождения. См. Unix.stackexchange.com/a/91200 Обратите внимание, что OS X поддерживает время рожденияstat -f %SB filename
Деннис Уильямсон
Также см. 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).

неизвестный пользователь
источник
-Не лучше, но это все еще полезный пост ...
BuvinJ
0

По этой ссылке unix не хранит дату создания. 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 строк в порядке изменения первого файла, и вы можете увидеть, какой он

barlop
источник
-tвремя модификации; -uвремя доступа
Деннис Уильямсон
спасибо .. мне было интересно насчет -у .. различия .. и да как ты предлагаешь .. -т и -у приказано временем .. как у человека это есть. лучше, чем говорить это заказы по дате.
2010 года
хотя, возможно, не так хорошо, как говорят, упорядоченные по дате / времени ;-)
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 "
user744989
источник
Вы должны объяснить более подробно, что это делает, с некоторыми ссылками на команду, чтобы у людей, которые потенциально могут ее использовать, была возможность прочитать об этом или услышать, как вы разбили это немного больше, чем просто доказательство команд и синтаксиса.
Сок Pimp IT