it-swarm.com.de

Wie entferne ich mehrere Dateien mit einem gemeinsamen Präfix und Suffix?

Ich habe viele Dateien benannt

sequence_1_0001.jpg  
sequence_1_0002.jpg  
sequence_1_0003.jpg  
...

und Dateien benannt

sequence_1_0001.hmf  
sequence_1_0002.hmf  
sequence_1_0003.hmf  
...

und Dateien benannt

sequence_2_0001.jpg  
sequence_2_0002.jpg  
sequence_2_0003.jpg  
...

und

sequence_2_0001.hmf  
sequence_2_0002.hmf  
sequence_2_0003.hmf  
...

Ich möchte nur die Dateien entfernen, die mit 'sequence_1' beginnen und mit '.hmf' enden, aber ich möchte sie nicht einzeln entfernen, da es Tausende von Dateien gibt. Wie kann ich im Befehl rm angeben, dass alle Elemente entfernt werden sollen, die mit dem Präfilx 'sequence_1' beginnen und mit '.hmf' enden?

Ich arbeite derzeit mit einem RedHat Linux-System, möchte aber wissen, wie es auch auf anderen Distributionen funktioniert.

22
Paul
rm sequence_1*.hmf

entfernt Dateien, die mit sequence_1 beginnen und mit .hmf enden.


Globbing ist der Prozess, bei dem Ihre Shell ein Muster aufnimmt und es zu einer Liste von Dateinamen erweitert, die diesem Muster entsprechen. Verwechseln Sie es nicht mit regulären Ausdrücken, die anders sind. Wenn Sie die meiste Zeit in bash verbringen, hat das Wooledge-Wiki ein gutes Seite zum Globbing (Pfadnamenerweiterung) . Wenn Sie maximale Portabilität wünschen, sollten Sie stattdessen auch POSIX-Spezifikation zum Mustervergleich lesen.


In dem unwahrscheinlichen Fall, dass Sie auf einen Fehler "Argumentliste zu lang" stoßen, können Sie sich BashFAQ 95 ansehen. was das anspricht. Die einfachste Problemumgehung besteht darin, das Glob-Muster in mehrere kleinere Teile aufzuteilen, bis der Fehler behoben ist. In Ihrem Fall könnten Sie wahrscheinlich davonkommen, die Übereinstimmung wie folgt durch die Präfixziffern 0 bis 9 aufzuteilen:

for c in {0..9}; do rm sequence_1_"$c"*.hmf; done
rm sequence_1*.hmf  # catch-all case
29
jw013

Obwohl die Antwort von jw013 mit globbing korrekt ist, kann dieser Befehl fehlschlagen, wenn Sie Tausende von Übereinstimmungen haben: die erweiterte Befehlszeile rm sequence_1_0001.hmf sequence_1_0002.hmf ..., das von der Shell generiert wird, ist möglicherweise einfach zu groß.

Wie Dom vorgeschlagen hat, können Sie auch das -delete Option mit find:

find . -maxdepth 1 -type f -name 'sequence_1*.hmf' -delete

Beide -maxdepth und -delete, obwohl nicht im POSIX-Standard sind in find-Implementierungen in freier Wildbahn ziemlich häufig. Linux-Distributionen verwenden im Allgemeinen GNU find, was diese Optionen sicherlich unterstützt.

14
Useless
rm sequence_1_{0000..0999}.hmf
rm sequence_1_{1000..1999}.hmf
rm sequence_1_{2000..2999}.hmf
...

würde auch in Bash funktionieren.

5
user unknown