Cosa significa [co] nel comando "rm -rf filename [co]"?


16

Diciamo che ho due file in /tmp:

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

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

Ora, eseguiamo il rm -rfcomando con l'opzione [co]

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

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

Qualcuno può spiegare cosa sta succedendo qui? Qual è il [co]parametro? Come possiamo farlo funzionare per altre estensioni? Diciamo che ho foo.jse foo.coffeefile, possiamo fare qualcosa di simile rm -rf /tmp/foo.coffe[co]per eliminare il /tmp/foo.js?


8
Non c'è bisogno di -rflì, poiché quelli non sono né directory ( --recursive), né unwritable ( --force).
deltab,

13
Non è necessario -rfe non è necessario fare le cose come root. Soprattutto se le cose in questione coinvolgono rm -rf.
terdon,

Ragazzi, è solo un esempio di comandi per spiegare il problema. La vera domanda riguardava [co]shell glob. Grazie.
aneeshep,

8
@aneeshep Se qualcuno sta guardando la canna di una pistola e chiede come pulirla, prima li avverti di guardare la canna o dici loro come pulirla?
Duncan X Simpson,

Risposte:


34

[co]non è un parametro per il rmcomando - è un shell glob che corrisponde a un modello uguale a un singolo carattere dell'insieme [co]- in altre parole, corrisponde a co oa alla fine del nome file. Da man bash:

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

Per abbinare entrambi foo.coffeee foo.js, poiché i suffissi non contengono affatto sottostringhe comuni, il meglio che potresti fare è quello foo.*che corrisponderebbe a qualsiasi nome di file che inizia con foo.Invece potresti usare l' espansione del controvento ad es.

rm foo.{coffee,js}

Sì capito. Mi mancava il concetto di base in bash;). Grazie :)
aneeshep

7
i modelli di ricerca come [abc]o *cercheranno file mentre {}non lo faranno. vai a / tmp, digita echo nya[ab]; echo nya{a,b}, quindi touch nyaae ancoraecho nya[ab]; echo nya{a,b}
Sanya_Zol

16

Non è un parametro ma una raccolta di lettere (o un "guscio glob"). Questo è lo stesso:

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

equivale a

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

Simile ...

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

eliminerebbe qualsiasi cosa /tmp/hello.pycfino al /tmp/hello.pyoseguente ordine ASCII incluso .

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

rimuoverebbe ...

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

ad esempio, ho i file foo.js e foo.coffee, possiamo fare qualcosa di simile rm -rf /tmp/foo.coffe[co]per eliminare il file /tmp/foo.js.

Puoi creare metodi piuttosto fantasiosi, ma per quei 2 file li rimuoverei semplicemente con 1 comando per ciascuno. Un altro esempio si avvicina il più possibile a quei 2 file ...

rm /tmp/foo.[cj]*

rimuoverebbe file come questo ...

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

quindi includerebbe molto più di questi soli 2 file.


2
Se non ho frainteso, si ottiene una invocazione di rm -rftutte le partite, non molte invocazioni ognuna con una corrispondenza.

1
sì. ma non l'intento della RM ho aggiunto. quelli sono solo per mostrare ciò che sarebbe necessario per essere digitato come equivalente ;-)
Rinzwind

1

È un glob shell, simile ai caratteri jolly *e ?... in bash, il modello del nome file *.[co]corrisponde a tutti i nomi di file che terminano con .co .o.

La differenza con *.[co]versus *.c *.oo *.{c,o}è che questi ultimi due pattern si espandono in un fittizio *.ose non ci sono .ofile nella directory, mentre la *.[co]versione no.

I globs della shell sono utili per eseguire operazioni sui file in modo non sensibile al maiuscolo / minuscolo. Ad esempio, se si dispone di un gruppo di file con nomi di file che terminano con jpg, JPG, Jpg, JPg, ecc ... e si desidera rimuovere tutti loro, si può fare:

rm *.[Jj][Pp][Gg]
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.