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 -rf
Befehl 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.js
und foo.coffee
Dateien, können wir etwas tun rm -rf /tmp/foo.coffe[co]
, um die zu löschen /tmp/foo.js
?
command-line
bash
rm
aneeshep
quelle
quelle
-rf
, da dies weder Verzeichnisse (--recursive
) noch nicht beschreibbare (--force
) sind.-rf
und es gibt keine Notwendigkeit, Dinge als root zu tun. Vor allem, wenn es um Dinge gehtrm -rf
.[co]
Shell Glob. Vielen Dank.Antworten:
[co]
ist kein Parameter für denrm
Befehl - es ist ein Shell-Glob , der einem Muster entspricht, das einem einzelnen Zeichen aus der Menge entspricht[co]
- mit anderen Worten, er entspricht entweder einemc
oder einemo
Ende des Dateinamens. Vonman bash
:Um beide zuzuordnen
foo.coffee
undfoo.js
da 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, zquelle
[abc]
oder*
werden nach Dateien suchen, während dies{}
nicht der Fall ist. Gehe zu / tmp,echo nya[ab]; echo nya{a,b}
touch nyaa
echo nya[ab]; echo nya{a,b}
Es ist kein Parameter, sondern eine Sammlung von Buchstaben (oder ein "Shell Glob"). Das ist das gleiche:
ist das gleiche wie
Ähnlich ...
würde alles von
/tmp/hello.pyc
bis einschließlich löschen/tmp/hello.pyo
folgenden ASCII-Reihenfolge .würde entfernen ...
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 ...
würde solche Dateien entfernen ...
es würde also weit mehr als nur diese 2 Dateien enthalten.
quelle
rm -rf
alle Übereinstimmungen, nicht viele Aufrufe für jede Übereinstimmung.Es ist ein Shell-Glob, ähnlich wie bei Platzhaltern
*
und?
... in der Bash*.[co]
stimmt das Dateinamenmuster mit allen Dateinamen überein, die mit.c
oder enden.o
.Der Unterschied im
*.[co]
Vergleich zu*.c *.o
oder*.{c,o}
ist , dass die beiden letztgenannten Muster zu einem Dummy erweitern ,*.o
wenn keine.o
Dateien 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:quelle