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
csny
quelle

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/.

John WH Smith
quelle
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
serenesat
quelle
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