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_sorted
die 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 ls
schon genommen. Aber es ist wirklich nicht sicher.
Bearbeiten:Neufind_date_sorted
mit 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: Om
um 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 -R
ist 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 ]