Як перевірити, що 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

Відповіді:


51

Знайшли його тут

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

14
Також -ot"старше".
Денніс Вільямсон

1
Я думаю, що я просто зіткнувся з проблемою з цим. Для файлів з однаковим часом модифікації до секунд вони мають "той самий" вік за допомогою цих тестів; і -nt і -ot дають однаковий результат (false). У моєму випадку використання одна програма читає вихід інших, і мені потрібно переконатися, що вони працювали у правильному порядку. У цьому випадку видається необхідним порівняти наносекунди.
sjmc


7

Ще один спосіб зробити це:

find -name file2 -newer file1

поверне null, якщо file2 старший або той же вік, що і file1. Він поверне ім'я (та каталог) файла2, якщо він новіший.

Майте на увазі, що 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).


-nt, як правило, краще, але це все-таки корисна публікація ...
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 рядків, щоб спочатку змінили файл, і ви можете побачити, що це таке


-t- час модифікації; -uє час доступу
Денніс Вільямсон

дякую .. мені було цікаво про -у .. відмінність .. і так, як ви пропонуєте .. -т і -у впорядкований часом .. як людина має. краще, ніж вимовляти замовлення за датою.
барлоп

хоча, можливо, не так добре, як сказати впорядковано за датою / часом ;-)
барлоп

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.