Löschen bestimmter Dateien basierend auf dem Dateinamen vom Terminal

13

Ich habe ein Verzeichnis mit Dateien mit Namen

rho_0.txt
rho_5000.txt
rho_10000.txt
rho_150000.txt
rho_200000.txt

und so weiter. Ich möchte alle löschen, die ein Vielfaches von 5000 sind.

Ich habe Folgendes versucht:, printf 'rho_%d.txt\n' $(seq 5000 10000 25000) | rmaber das gab mir die Antwort rm: missing operand.

Gibt es eine andere Möglichkeit, dies zu tun?

Billy Jean
quelle
6
Unabhängig davon, wie Sie dies tun, empfehle ich (aus Sicherheitsgründen), die gewünschten Dateien in ein Verzeichnis zu verschieben. Wenn Sie dann bestätigt haben, dass sich alle und nur die zu löschenden Dateien im Verzeichnis befinden, löschen Sie das Verzeichnis.
user117529
Sicherheit ist hier wichtig. Ich teste diese Dinge im Allgemeinen lszuerst mit.
Scot

Antworten:

49

Sie brauchen keine Schleife oder zusätzliche Befehle, wo Sie haben Bash Shell Brace Expansion.

rm -f rho_{0..200000..5000}.txt

Erläuterung : {start..end..step}. Die -fzu ignorierende Eingabeaufforderung für nicht vorhandene Dateien.


PS Um die Sicherheit zu wahren und zu überprüfen, welche Dateien gelöscht werden, führen Sie bitte zuerst einen Test durch mit:

ls -1 rho_{0..200000..5000}.txt
αғsнιη
quelle
13

rmliest nicht von der Standardeingabe. Du könntest es tun:

for i in $(seq 5000 5000 25000); do
    rm -i rho_${i}.txt
done

Ich schließe die -iOption ein, rmvor dem Entfernen eine Eingabeaufforderung abzugeben, damit Sie das Verhalten überprüfen können. Wenn Sie sicher sind, dass es das tut, was Sie wollen, können Sie diese Option weglassen.

Bearbeiten: Alternativ können Sie Folgendes tun:

for ((i = 5000; i <= 25000; i += 5000)); do
    rm -i rho_${i}.txt
done

Dieses Formular ist möglicherweise vertrauter, wenn Sie programmiert haben.

Andy Dalton
quelle
12

Sie können keine Pipe zu einem Programm erstellen, als wäre der Inhalt der Pipe ein Argument. Es wird durch stdin geschickt.

Sie sollten xarg für diesen Zweck verwenden:

printf 'rho_%d.txt\n' $(seq 5000 10000 25000) | xargs rm 

Aber zuerst können Sie es mit echo versuchen, um zu sehen, ob alles so ist, wie Sie es beabsichtigen:

printf 'rho_%d.txt\n' $(seq 5000 10000 25000) | xargs echo
M4rty
quelle
Wenn Ihre Version von seqder hat -f/ --formatOption können Sie , dass anstelle dieser Behelfslösung mit verwenden printfund Kommandosubstitution.
David Foerster
Vielen Dank, ich habe gerade mit dem in der Frage verwendeten Befehl geantwortet und versucht, seinen rm-Fehler zu erklären
M4rty
9

Jemand korrigiert mich, wenn ich falsch liege, aber wenn alle Dateien, die mit "" beginnen, rho_von dieser Form sind, ist dies nicht gleichbedeutend mit ""

rm rho_0.txt rho_*[05]000.txt

Da eine Zahl (ungleich 0) genau dann ein Vielfaches von 5000 ist, wenn sie auf 0000 oder 5000 endet.

(0 ist ein Sonderfall, da es ein Vielfaches von 5000 ist, aber normalerweise ohne zusätzliche führende Nullen geschrieben wird. Wenn Sie nicht vorhatten, 0 einzuschließen, nehmen Sie es aus der obigen Zeile heraus.)

Dies sollte natürlich nur verwendet werden, wenn alle rho_*.txtDateien in Ihrem Verzeichnis die gewünschte Form haben. Verwenden Sie es nicht, wenn Ihr Verzeichnis auch enthält rho_please_dont_delete_me_5000.txt.

(Mathematische Anmerkung: Dies funktioniert genau deshalb, weil alle Primfaktoren von 5000, nämlich 2 und 5, auch Primfaktoren der Basis sind, in der wir arbeiten. 10. Entsprechend gibt es eine ausreichend große Potenz von 10 (nämlich 10000) durch 5000 teilbar. Es gibt keinen ähnlichen Trick für die Zuordnung aller Vielfachen von 3000.)

Nate Eldredge
quelle
Das ist eigentlich die beste Antwort.
Cesarv