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

15

Diciamo che ho due file in /tmp :

[email protected]:~# touch /tmp/hello.{pyc,py}

[email protected]:~# ls /tmp/
hello.py  hello.pyc

Ora, consente di eseguire il comando rm -rf con l'opzione [co]

[email protected]:~# rm -rf /tmp/hello.py[co]

[email protected]:~# ls /tmp/
hello.py

Qualcuno può spiegare cosa sta succedendo qui? Qual è il parametro [co] ? Come possiamo farlo funzionare per altre estensioni? Supponiamo che io abbia foo.js e foo.coffee file, possiamo fare qualcosa come rm -rf /tmp/foo.coffe[co] per eliminare /tmp/foo.js ?

    
posta aneeshep 20.07.2016 - 12:14

3 risposte

34

[co] non è un parametro del comando rm - è un globulare che corrisponde a un modello uguale a un singolo carattere dall'insieme [co] - in altre parole, esso corrisponde a c o a o alla fine del nome file. Da man bash :

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

Per abbinare sia foo.coffee che foo.js , poiché i suffissi non contengono alcuna sottostringa comune, la cosa migliore che potresti fare è foo.* che dovrebbe corrispondere a qualsiasi nomefile che inizia con foo. Invece potresti usare potenziare l'espansione ad es.

rm foo.{coffee,js}
    
risposta data steeldriver 20.07.2016 - 12:23
16

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

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

è uguale a

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

Simili ...

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

eliminerebbe qualsiasi cosa da /tmp/hello.pyc fino ae includendo /tmp/hello.pyo seguendo l'ordinamento ASCII.

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

rimuovere ...

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

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

rm /tmp/foo.[cj]*

rimuoverà file come questo ...

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

quindi includerebbe molto più di questi due file.

    
risposta data Rinzwind 20.07.2016 - 12:25
1

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

La differenza con *.[co] rispetto a *.c *.o o *.{c,o} è che gli ultimi due modelli si espandono in un% fittizio co_de% se nella directory non esistono file *.o , mentre la versione .o ha vinto ' t.

I globi di shell sono utili per eseguire operazioni sui file in un modo non sensibile al maiuscolo / minuscolo. Ad esempio, se hai un sacco di file con nomi di file che terminano con *.[co] , jpg , JPG , Jpg , ecc ... e vuoi rimuoverli tutti, puoi fare:

rm *.[Jj][Pp][Gg]
    
risposta data delt 26.07.2016 - 19:45

Leggi altre domande sui tag