Wie überprüfe ich, ob file2 neuer ist als file1 in bash?


51

Wie kann ich überprüfen, ob das file2zuletzt geändert wurde file1?

In diesem Beispiel perlwurde vor kurzem geändert als stack. Gibt es einen Bash- oder Linux-Befehl, mit dem diese Dateien basierend auf der Änderungszeit verglichen werden können ?

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

Antworten:


51

Habe es hier gefunden

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

14
Ist auch -ot"älter als".
Dennis Williamson

1
Ich glaube, ich bin gerade auf ein Problem gestoßen. Bei Dateien mit der gleichen Änderungszeit von bis zu Sekunden haben diese Tests das gleiche Alter. Sowohl -nt als auch -ot ergeben dasselbe Ergebnis (false). In meinem Anwendungsfall muss ein Programm die Ausgabe der anderen Programme lesen und sicherstellen, dass sie in der richtigen Reihenfolge ausgeführt werden. In diesem Fall erscheint es notwendig, Nanosekunden zu vergleichen.
sjmc

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

Entnommen aus " Man Test ". Auszug:

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

7

Ein anderer Weg dies zu tun:

find -name file2 -newer file1

Gibt null zurück, wenn file2 älter oder gleich alt wie file1 ist. Es gibt den Namen (und das Verzeichnis) von Datei2 zurück, wenn es neuer ist.

Beachten Sie, dass Linux nicht nachverfolgt, wann Dateien erstellt wurden. Diese Tests beziehen sich auf das Datum und die Uhrzeit der letzten Änderung.


2
Linux verfolgt die Erstellungszeit: Sie heißt ctime. Außerdem wird die letzte Zugriffszeit protokolliert: atime. Im Allgemeinen wird nur mtime verwendet, da dies die letzte Änderungszeit ist, die am nützlichsten ist.
Coroos

2
@Coroos: Ist ctimekeine Erstellungszeit. Dies ist die Inode-Änderungszeit und wird aktualisiert, wenn die Dateiattribute wie Eigentümer oder Berechtigungen geändert werden oder wenn Sie die Datei ändern. Einige Dateisysteme unterstützen die Geburtszeit, der Kernel jedoch nicht. Statistik zeigt eine leere Geburtszeit. Siehe unix.stackexchange.com/a/91200. Beachten Sie, dass OS X die Geburtszeit unterstütztstat -f %SB filename
Dennis Williamson,

Lesen Sie auch unter htrp: //unix.stackexchange.com/a/50184 nach, wie debugfsSie die Erstellungszeit (Geburtszeit) unter Linux anzeigen können .
Dennis Williamson

2

Wenn Sie detailliertere Informationen wünschen, können Sie den statBefehl verwenden

<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

Wenn das Ergebnis> 0 ist, ist die erste Datei neuer. (Neuer in Bezug auf die letzte Änderung, nicht die Erstellungszeit, die unter Linux gespeichert ist).


-nt ist in der Regel besser, aber dies ist immer noch ein nützlicher Beitrag ...
BuvinJ

0

Laut diesem Link speichert Unix kein Erstellungsdatum. http://www.issociate.de/board/post/302628/How_to_check_file_creation_date.html

Speichert aber den letzten Zugriff.

für den letzten Zugriff

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

ls zeigt jede Datei in einer neuen Zeile an.

ls -t zeigt die neueste Datei in der ersten Zeile usw. an.

  • Sie können selbst die erste Zeile auswählen.
  • Mit sed können Sie die erste Zeile auswählen.

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

tun könnte , -lt es gibt die Gesamt in der ersten Zeile , obwohl Sie das sehen werden , wenn Sie keine Dateien spezifizieren .. und es das Verzeichnis ist .. dann, so wählen Sie die zweite Zeile wie$ls -lt | sed -n '2p'

Ein guter wäre

ls -t | head -n 1

oder

ls -lt | head   

Zeigt die ersten 10 Zeilen in der Reihenfolge an, in der die erste Datei zuerst geändert wurde, und Sie können sehen, um welche es sich handelt


-tist Änderungszeit; -uist Zugriffszeit
Dennis Williamson

danke .. ich habe mich über -u .. die Unterscheidung gewundert .. und ja wie du vorschlägst .. -t und -u nach Zeit geordnet .. wie man es hat. Besser als zu sagen, dass es nach Datum sortiert ist.
Barlop

obwohl vielleicht nicht so gut wie gesagt nach datum /
uhrzeit

0

Hier ist ein kleines Skript, das ich gemacht habe:

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

Sie sollten die Funktionsweise anhand einiger Verweise auf den Befehl näher erläutern, damit Benutzer, die ihn möglicherweise verwenden, die Möglichkeit haben, darüber zu lesen oder zu hören, wie Sie ihn ein wenig auflösen, anstatt nur die Befehle und die Syntax zu beweisen.
Pimp Juice IT
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.