Da Ihre Dateinamen im Format vorliegen file.00064.name.99999.end
, müssen wir zuerst alles außer unserer Nummer entfernen. Wir werden eine for
Schleife verwenden, um dies zu tun.
Wir müssen der Bash-Shell auch mitteilen, dass sie die Basis 10 verwenden soll, da die Bash-Arithmetik sie mit einer 0 beginnende Zahlen als Basis 8 behandelt, was die Sache für uns durcheinander bringt.
Als Skript, das im Verzeichnis mit den Dateien gestartet werden soll, verwenden Sie:
#!/bin/bash
for f in ./*
do
if [[ -f "$f" ]]; then
file="${f%.*}"
if [[ $((10#${file##*.} % 12)) -ne 0 ]]; then
rm "$f"
fi
else
echo "$f is not a file, skipping."
fi
done
Oder Sie können diesen sehr langen, hässlichen Befehl verwenden, um dasselbe zu tun:
for f in ./* ; do if [[ -f "$f" ]]; then file="${f%.*}"; if [[ $((10#${file##*.} % 12)) -ne 0 ]]; then rm "$f"; fi; else echo "$f is not a file, skipping."; fi; done
So erklären Sie alle Teile:
for f in ./*
bedeutet für alles im aktuellen Verzeichnis, mache .... Dies setzt jede gefundene Datei oder jedes Verzeichnis als Variable $ f.
if [[ -f "$f" ]]
prüft, ob es sich bei dem gefundenen Element um eine Datei handelt. Wenn dies nicht echo "$f is not...
der Fall ist, springen wir zum Teil, was bedeutet, dass wir nicht versehentlich mit dem Löschen von Verzeichnissen beginnen.
file="${f%.*}"
Legt die Variable $ file als Dateinamen fest und schneidet ab, was nach dem letzten kommt .
.
if [[ $((10#${file##*.} % 12)) -eq 0 ]]
Hier setzt die Hauptarithmetik an. Das ${file##*.}
schneidet alles vor dem letzten .
in unserem Dateinamen ohne Erweiterung. $(( $num % $num2 ))
ist die Syntax für die Bash-Arithmetik zur Verwendung der Modulo-Operation, die 10#
Bash am Anfang anweist, die Basis 10 zu verwenden, um mit diesen nervigen führenden Nullen umzugehen. $((10#${file##*.} % 12))
Dann lässt uns der Rest unserer Dateinamen durch 12 geteilt. -ne 0
Überprüft, ob der Rest "ungleich" zu Null ist.
- Wenn der Rest nicht gleich 0 ist, wird die Datei mit dem gelöschten
rm
Befehl, können Sie ersetzen rm
mit , echo
wenn zuerst die ausgeführt wird , um zu überprüfen , dass Sie die erwarteten Dateien erhalten zu löschen.
Diese Lösung ist nicht rekursiv, dh, es werden nur Dateien im aktuellen Verzeichnis verarbeitet und keine Unterverzeichnisse angelegt.
Die if
Anweisung mit dem echo
Befehl zum Warnen vor Verzeichnissen ist nicht unbedingt erforderlich, da rm
Verzeichnisse von sich aus beanstandet und nicht gelöscht werden.
#!/bin/bash
for f in ./*
do
file="${f%.*}"
if [[ $((10#${file##*.} % 12)) -ne 0 ]]; then
rm "$f"
fi
done
Oder
for f in ./* ; do file="${f%.*}"; if [[ $((10#${file##*.} % 12)) -ne 0 ]]; then rm "$f"; fi; done
Funktioniert auch einwandfrei.