Jak sprawdzić, czy plik2 jest nowszy niż plik1 w bash?

51

Jak mogę sprawdzić, czy file2po ostatniej modyfikacji file1?

W tym przykładzie perlzostał zmodyfikowany niedawno niż stack. Czy istnieje polecenie bash lub Linux, które może porównywać te pliki na podstawie czasu modyfikacji?

-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
źródło

Odpowiedzi:

51

Znalazłem to tutaj

for f in /abcd/xyz* do
   [ "$f" -nt /abcd/test.txt ] && echo "file f$ found" done
subanki
źródło
14
-otJest także „starszy niż”.
Dennis Williamson,
1
Myślę, że właśnie miałem z tym problem. W przypadku plików o tym samym czasie modyfikacji do sekund są one w tym samym wieku według tych testów; zarówno -nt, jak i -ot dają ten sam wynik (fałsz). W moim przypadku mam jeden program odczytujący wyniki innych i muszę się upewnić, że działają one w prawidłowej kolejności. W takim przypadku wydaje się konieczne porównanie nanosekund.
sjmc
38
if [[ FILE1 -nt FILE2 ]]; then
  echo FILE1 is newer than FILE2
fi

Zaczerpnięte z „ testu na człowieku ”. Fragment:

FILE1 -nt FILE2
  FILE1 is newer (modification date) than FILE2
Eddie Parker
źródło
7

Inny sposób to zrobić:

find -name file2 -newer file1

zwróci null, jeśli plik2 jest starszy lub w tym samym wieku co plik1. Zwróci nazwę (i katalog) pliku2, jeśli jest nowszy.

Pamiętaj, że Linux nie śledzi, kiedy pliki zostały utworzone. Testy będą dotyczyły ostatniej daty i godziny modyfikacji.

Dennis Williamson
źródło
2
Linux śledzi czas tworzenia: nazywa się ctime. Śledzi także czas ostatniego dostępu: atime. Po prostu używa mtime ogólnie, ponieważ jest to czas ostatniej modyfikacji, który jest najbardziej przydatny.
Coroos,
2
@Coroos: ctimeto nie czas tworzenia. Jest to czas zmiany i-węzła i jest aktualizowany, gdy atrybuty pliku, takie jak właściciel lub uprawnienia lub zmienione, lub podczas modyfikacji pliku. Niektóre systemy plików obsługują czas narodzin, ale jądro nie. Statystyki pokazują pusty czas urodzenia. Zobacz unix.stackexchange.com/a/91200 Należy pamiętać, że OS X obsługuje poródstat -f %SB filename
Dennis Williamson
Zobacz także htrp: //unix.stackexchange.com/a/50184, aby dowiedzieć się, jak używać czasu debugfswyświetlania (narodzin) w systemie Linux.
Dennis Williamson
2

Jeśli chcesz uzyskać bardziej szczegółowe informacje, możesz użyć statpolecenia

<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
Tim Bielawa
źródło
2
echo $(($(date -r file1 +%s)-$(date -r file2 +%s)))
2208

Jeśli wynik to> 0, pierwszy plik jest nowszy. (Nowsze pod względem czasu ostatniej modyfikacji, a nie czasu tworzenia, który jest przechowywany w systemie Linux).

nieznany użytkownik
źródło
-nt jest na ogół lepszy, ale nadal jest to przydatny post ...
BuvinJ
0

Według tego linku unix nie przechowuje daty utworzenia. http://www.issociate.de/board/post/302628/How_to_check_file_creation_date.html

Ale przechowuje ostatni dostęp.

dla ostatniego dostępu

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

ls wyświetla każdy plik w nowym wierszu.

więc ls -t wyświetla najnowszy plik w pierwszym wierszu itp.

  • Możesz użyć siebie, aby wybrać pierwszą linię.
  • Możesz użyć sed, aby wybrać pierwszą linię.

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

mógłbym to zrobić, -lt ale zobaczysz, że jeśli nie określisz żadnych plików .. i robi to katalog ... to daje sumę w pierwszym wierszu, więc wybierasz drugi wiersz jak$ls -lt | sed -n '2p'

Byłby dobry

ls -t | head -n 1

lub

ls -lt | head   

wyświetla pierwsze 10 wierszy w kolejności najpierw zmodyfikowany plik i możesz zobaczyć, który to plik

barlop
źródło
-tto czas modyfikacji; -ujest czas dostępu
Dennis Williamson
dzięki .. zastanawiałem się nad -u .. rozróżnieniem .. i tak, jak sugerujesz ... -t i -u uporządkowane według czasu .. jak ma to człowiek. lepiej niż powiedzieć, że zamawia według daty.
barlop
choć może nie tak dobre, jak powiedzenie uporządkowane według daty / godziny ;-)
barlop
0

Oto mały skrypt, zrobiłem:

mtf0=`stat -c %Y file0`    
mtf1=`stat -c %Y file1`    
dt=$(( mtf1 - mtf0 ))    
[[ $dt -gt 0 ]] && echo "File F1 is newer than file F0 "
użytkownik744989
źródło
Powinieneś wyjaśnić bardziej szczegółowo, co to robi z niektórymi odniesieniami do polecenia, aby osoby, które potencjalnie go używają, miały okazję przeczytać o nim lub usłyszeć, jak go złamać, nie tylko udowadniając polecenia i składnię.
Pimp Juice IT