älteste Dateien entfernen

älteste Dateien entfernen

Ich versuche, alte Dateien aus dem Verzeichnis zu löschen und nur die drei neuesten Dateien zu belassen.

cd /home/user1/test

while [ `ls -lAR | grep ^- | wc -l` < 3 ] ; do

    rm `ls -t1 /home/user/test | tail -1`
    echo " - - - "

done

mit der bedingten Anweisung stimmt etwas nicht.

Antwort1

Wenn Sie Dateien in einer Schleife abspielen möchten,benutze niemalsls*. tl;dr Es gibt viele Situationen, in denen Sie am Ende die falsche Datei oder sogar alle Dateien löschen.

Allerdings ist dies leider eine schwierige Sache, die man in Bash richtig machen kann. Es gibt eine funktionierende Antwort aufdoppelte Frage meine noch älterefind_date_sorteddie Sie mit kleinen Modifikationen verwenden können:

counter=0
while IFS= read -r -d '' -u 9
do
    let ++counter
    if [[ counter -gt 3 ]]
    then
        path="${REPLY#* }" # Remove the modification time
        echo -e "$path" # Test
        # rm -v -- "$path" # Uncomment when you're sure it works
    fi
done 9< <(find . -mindepth 1 -type f -printf '%TY-%Tm-%TdT%TH:%TM:%TS %p\0' | sort -rz) # Find and sort by date, newest first

* Nichts für ungut, Leute – ich habe es auch lsschon genommen. Aber es ist wirklich nicht sicher.

Bearbeiten:Neufind_date_sortedmit Unit-Tests.

Antwort2

Um alle Dateien außer den drei neuesten mit einem Zsh-Glob zu löschen, können Sie Om(mit großem O) die Dateien von der ältesten zur neuesten sortieren und mit einem Index die gewünschten Dateien auswählen.

rm ./*(Om[1,-4])
#    | ||||  ` stop at the 4th to the last file (leaving out the 3 newest)
#    | |||` start with first file (oldest in this case)
#    | ||` subscript to pick one or a range of files
#    | |` look at modified time
#    | ` sort in descending order
#    ` start by looking at all files

Weitere Beispiele:

# delete oldest file (both do the same thing)
rm ./*(Om[1])
rm ./*(om[-1])

# delete oldest two files
rm ./*(Om[1,2])

# delete everything but the oldest file
rm ./*(om[1,-2])

Antwort3

Die mit Abstand einfachste Methode ist die Verwendung von zsh und dessenGlob-Qualifikation: Omum nach absteigendem Alter zu sortieren (d. h. älteste zuerst) und [1,3]nur die ersten drei Übereinstimmungen beizubehalten.

rm ./*(Om[1,3])

Siehe auchWie filtere ich einen Glob in zshfür weitere Beispiele.

Und beherzigen Siel0b0s Rat: Ihr Code wird schrecklich kaputt gehen, wenn Sie Dateinamen haben, die Shell-Sonderzeichen enthalten.

Antwort4

Erstens -Rist die Option für Rekursion, was wahrscheinlich nicht das ist, was Sie wollen - das würde auch in allen Unterverzeichnissen suchen. Zweitens <ist der Operator (wenn er nicht als Umleitung angesehen wird) für den Stringvergleich. Sie wollen wahrscheinlich -lt. Versuchen Sie:

while [ `ls -1A | grep ^- | wc -l` -lt 3 ]

Aber ich würde hier „find“ verwenden:

while [ `find . -maxdepth 1 -type f -print | wc -l` -lt 3 ]

verwandte Informationen