Was bedeutet [co] im Befehl "rm -rf filename [co]"?

16

Angenommen, ich habe zwei Dateien in /tmp:

root@ubuntu:~# touch /tmp/hello.{pyc,py}

root@ubuntu:~# ls /tmp/
hello.py  hello.pyc

Führen Sie nun den rm -rfBefehl mit der Option [co] aus

root@ubuntu:~# rm -rf /tmp/hello.py[co]

root@ubuntu:~# ls /tmp/
hello.py

Kann jemand bitte erklären, was hier passiert? Was ist der [co]Parameter? Wie können wir es für andere Erweiterungen arbeiten lassen? Angenommen, ich habe foo.jsund foo.coffeeDateien, können wir etwas tun rm -rf /tmp/foo.coffe[co], um die zu löschen /tmp/foo.js?

aneeshep
quelle
8
Es besteht keine Notwendigkeit dafür -rf, da dies weder Verzeichnisse ( --recursive) noch nicht beschreibbare ( --force) sind.
Deltab
13
Es gibt keine Notwendigkeit -rfund es gibt keine Notwendigkeit, Dinge als root zu tun. Vor allem, wenn es um Dinge geht rm -rf.
Terdon
Leute, es sind nur Beispielbefehle, um das Problem zu erklären. Die eigentliche Frage war über [co]Shell Glob. Vielen Dank.
Aneeshep
8
@aneeshep Wenn jemand auf den Lauf einer Waffe schaut und fragt, wie er zu reinigen ist, warnen Sie ihn zuerst davor, auf den Lauf zu schauen, oder sagen Sie ihm, wie er zu reinigen ist?
Duncan X Simpson

Antworten:

34

[co]ist kein Parameter für den rmBefehl - es ist ein Shell-Glob , der einem Muster entspricht, das einem einzelnen Zeichen aus der Menge entspricht[co] - mit anderen Worten, er entspricht entweder einem coder einem oEnde des Dateinamens. Von man bash:

[...]  Matches any one of the enclosed characters

Um beide zuzuordnen foo.coffeeund foo.jsda die Suffixe überhaupt keine gemeinsamen Teilzeichenfolgen enthalten, ist das Beste, was Sie tun können, foo.*die jedem Dateinamen entsprechen, der mit beginnt. foo.Stattdessen können Sie eine geschweifte Klammer verwenden, z

rm foo.{coffee,js}
Stahlfahrer
quelle
Yup hat es verstanden. Ich habe das Grundkonzept in bash verpasst;). Vielen Dank :)
aneeshep
7
Suchmuster wie [abc]oder *werden nach Dateien suchen, während dies {}nicht der Fall ist. Gehe zu / tmp, echo nya[ab]; echo nya{a,b}touch nyaaecho nya[ab]; echo nya{a,b}
tippe
16

Es ist kein Parameter, sondern eine Sammlung von Buchstaben (oder ein "Shell Glob"). Das ist das gleiche:

rm -rf /tmp/hello.py[co]

ist das gleiche wie

rm -rf /tmp/hello.pyc
rm -rf /tmp/hello.pyo

Ähnlich ...

rm -rf /tmp/hello.py[c-o]

würde alles von /tmp/hello.pycbis einschließlich löschen/tmp/hello.pyo folgenden ASCII-Reihenfolge .

rm -rf /tmp/hello.py[ab][cd]

würde entfernen ...

rm -rf /tmp/hello.pyac
rm -rf /tmp/hello.pyad
rm -rf /tmp/hello.pybc
rm -rf /tmp/hello.pybd

Sagen wir, ich habe foo.js und foo.coffee Dateien, können wir so etwas tun rm -rf /tmp/foo.coffe[co] das löschen /tmp/foo.js.

Sie können ziemlich ausgefallene Methoden erstellen, aber für diese beiden Dateien würde ich sie einfach mit jeweils einem Befehl entfernen. Ein weiteres Beispiel, wie man diesen 2 Dateien so nah wie möglich kommt ...

rm /tmp/foo.[cj]*

würde solche Dateien entfernen ...

rm /tmp/foo.c*
rm /tmp/foo.j*

es würde also weit mehr als nur diese 2 Dateien enthalten.

Rinzwind
quelle
2
Wenn ich das nicht missverstehe, erhalten Sie einen Aufruf für rm -rfalle Übereinstimmungen, nicht viele Aufrufe für jede Übereinstimmung.
1
Ja. aber nicht die absicht der rms, die ich hinzugefügt habe. diese sollen nur zeigen, was nötig wäre, um als Äquivalent eingegeben zu werden
;-)
1

Es ist ein Shell-Glob, ähnlich wie bei Platzhaltern *und ?... in der Bash *.[co]stimmt das Dateinamenmuster mit allen Dateinamen überein, die mit .coder enden.o .

Der Unterschied im *.[co]Vergleich zu *.c *.ooder *.{c,o}ist , dass die beiden letztgenannten Muster zu einem Dummy erweitern , *.owenn keine .oDateien im Verzeichnis vorhanden sind , während die *.[co]Version nicht.

Shell-Globs sind nützlich, um Dateioperationen ohne Berücksichtigung der Groß- und Kleinschreibung durchzuführen. Zum Beispiel, wenn Sie eine Reihe von Dateien mit Dateinamen , dem Ende haben mit jpg, JPG, Jpg, JPg, etc ... und Sie wollen alle von ihnen zu entfernen, können Sie tun:

rm *.[Jj][Pp][Gg]
geschlafen
quelle