Hoe Datums Van Bestanden Vergelijken In Bash?

Gepubliceerd 10 augustus 2024

Probleem: Bestandsdatums Vergelijken in Bash

Het vergelijken van bestandsdatums in Bash is een veelvoorkomende taak bij het beheren van bestanden en mappen. Het helpt om nieuwere of oudere bestanden te identificeren, bestandsoperaties te automatiseren op basis van tijdstempels en versiebeheer te onderhouden in scripts.

Bash Test Operatoren Gebruiken

Bestandswijzigingstijden Vergelijken

Bash heeft test operatoren voor het vergelijken van bestandswijzigingstijden. Deze operatoren maken het gemakkelijk om te bepalen welk bestand nieuwer of ouder is:

  • De -nt (newer than) operator: Controleert of het eerste bestand nieuwer is dan het tweede bestand.
  • De -ot (older than) operator: Controleert of het eerste bestand ouder is dan het tweede bestand.

Deze operatoren werken met bestandsnamen en hebben geen aparte tijdstempelinformatie nodig.

Basissyntaxis voor Bestandsdatumvergelijking

Om bestandsdatums te vergelijken en het oudere bestand te vervangen door het nieuwere, gebruik je een if statement met deze operatoren. Hier is een basisstructuur:

if [ "$file1" -ot "$file2" ]; then
    cp -f "$file2" "$file1"
fi

Dit script vergelijkt twee bestanden, file1 en file2. Als file1 ouder is dan file2, vervangt het script file1 door file2. De -f optie met het cp commando forceert het overschrijven zonder te vragen.

Je kunt ook de -nt operator gebruiken om te controleren of een bestand nieuwer is:

if [ "$file1" -nt "$file2" ]; then
    cp -f "$file1" "$file2"
fi

Dit script vervangt file2 door file1 als file1 nieuwer is.

Deze methoden bieden een eenvoudige manier om bestandsdatums te vergelijken en acties uit te voeren op basis van de resultaten, zonder externe tools zoals rsync te gebruiken.

Tip: Omgaan Met Niet-Bestaande Bestanden

Controleer bij het vergelijken van bestandswijzigingstijden altijd eerst of de bestanden bestaan om fouten te voorkomen. Je kunt hiervoor de -e operator gebruiken:

if [ -e "$file1" ] && [ -e "$file2" ]; then
    if [ "$file1" -nt "$file2" ]; then
        cp -f "$file1" "$file2"
    fi
else
    echo "One or both files do not exist."
fi

Dit script controleert eerst of beide bestanden bestaan voordat het hun wijzigingstijden vergelijkt.

Aanvullende Methoden voor Bestandsdatumvergelijking

Het stat Commando Gebruiken

Het stat commando geeft informatie over bestanden, inclusief wijzigingstijden. Je kunt het gebruiken om bestandswijzigingstijden op te halen en te vergelijken:

  • Bestandswijzigingstijden ophalen:

    mod_time1=$(stat -c %Y file1)
    mod_time2=$(stat -c %Y file2)

    De -c %Y optie vertelt stat om de wijzigingstijd in seconden sinds het epoch te retourneren.

  • Numerieke tijdstempels vergelijken:

    if [ "$mod_time1" -gt "$mod_time2" ]; then
      echo "file1 is newer"
    else
      echo "file2 is newer or they have the same timestamp"
    fi

    Dit script vergelijkt de numerieke tijdstempels.

Tip: stat Gebruiken voor Leesbare Datums

Je kunt het stat commando gebruiken met de -c %y optie om leesbare wijzigingsdatums te krijgen:

stat -c %y file1

Dit zal de datum weergeven in een formaat zoals "2023-05-15 14:30:45.123456789 +0200".

Het find Commando Gebruiken

Het find commando zoekt bestanden op basis van criteria, inclusief wijzigingstijd:

  • Zoeken naar bestanden op basis van wijzigingstijd:

    find /path/to/directory -type f -newer reference_file

    Dit commando vindt alle bestanden in de map die nieuwer zijn dan het referentiebestand.

  • Combineren met andere bestandsoperaties:

    find /path/to/directory -type f -newer reference_file -exec cp {} /destination/directory \;

    Dit script vindt bestanden die nieuwer zijn dan het referentiebestand en kopieert ze naar een bestemmingsmap.

Deze methoden bieden meer opties voor bestandsvergelijking en beheertaken, waardoor je met meerdere bestanden en mappen kunt werken.