Löschen Sie Dateien, die älter als eine bestimmte Datei sind


14

Ich muss alle Dateien, die älter als eine bestimmte Datei sind, aus einem Ordner löschen.
Bash unter CentOS 7 ausführen

Ich habe eine Lösung dafür, aber ich denke, es sollte einen eleganteren Weg geben, dies zu tun:

reference_file=/my/reference/file

get_modify_time()
{
    stat $1 | grep -Po "Modify: \K[0-9- :]*"
}

pit=$(get_modify_time $reference_file)
for f in /folder/0000* ; do [[ "$pit" > "$(get_modify_time $f)" ]] && rm $f ; done

Antworten:


28

Ich habe es noch nicht ausprobiert, findsollte aber in der Lage sein, die gesamte Operation in Ordnung zu bringen:

$ find dir/ -type f ! -newer reference -delete

... oder...

$ find dir/ -type f ! -newer reference ! -name reference -delete

Grundsätzlich:

  • ! -newer referenceSucht nach Dateien, die vor kurzem geändert wurden reference.
  • -delete löscht sie.
  • ! -name referenceschließt aus reference, falls es sich auch unter befindet dir/und Sie es behalten möchten.

Dies sollte alle Dateien löschen, die älter als referenceund unter sind dir/.


2
Perfekt :). Gerade hinzugefügt -maxdepth 1, um die Suche nicht rekursiv zu halten
csny

3
! -newerbedeutet "nicht neuer", also "älter oder gleich alt "; Die Datei selbst wird abgeglichen, wenn sie sich im Pfad befindet find.
Ferada

1
@ferada Es wird nicht, wenn Sie es ausschließen, weshalb meine Antwort auch enthält ! -name reference(siehe den dritten Punkt).
John WH Smith

7

Vergleichen Sie die Änderungszeiten von Dateien testmit -nt(neuer als) und -ot(älter als) Operatoren:

if [ "$file1" -ot "$file2" ]; then
    #do whatever you want;
fi

2
Danke, das ist besser als meine Lösung, aber Sie müssen noch alle Dateien im Ordner iterieren und vergleichen ... Die andere Antwort ist noch eleganter
csny
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.