O que significa [co] no comando “rm -rf filename [co]”?

15

Digamos que eu tenha dois arquivos em /tmp :

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

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

Agora, vamos executar o comando rm -rf com a opção [co]

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

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

Alguém por favor pode explicar o que está acontecendo aqui? Qual é o parâmetro [co] ? Como podemos fazer funcionar para outras extensões? Digamos que eu tenha arquivos foo.js e foo.coffee , podemos fazer algo como rm -rf /tmp/foo.coffe[co] para excluir o /tmp/foo.js ?

    
por aneeshep 20.07.2016 / 12:14

3 respostas

34

[co] não é um parâmetro para o comando rm - é um glob de shell que corresponde a um padrão igual a um único caractere do conjunto [co] - em outras palavras, corresponde a c ou o a ao final do nome do arquivo. De man bash :

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

Para corresponder a foo.coffee e foo.js , pois os sufixos não contêm substrings comuns, o melhor que você pode fazer é foo.* , que corresponderia a qualquer nome do arquivo, começando com foo. Em vez disso, você poderia usar expansão de chave , por exemplo

rm foo.{coffee,js}
    
por steeldriver 20.07.2016 / 12:23
17

Não é um parâmetro, mas uma coleção de letras (ou um "shell glob"). Isso é o mesmo:

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

é o mesmo que

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

Semelhante ...

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

excluiria qualquer coisa de /tmp/hello.pyc até e inclusive /tmp/hello.pyo após a ordenação ASCII.

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

removeria ...

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

digamos, tenho arquivos foo.js e foo.coffee, podemos fazer algo como rm -rf /tmp/foo.coffe[co] para excluir o /tmp/foo.js .

Você pode criar métodos sofisticados, mas para esses dois arquivos eu os removia apenas com um comando para cada um. Outro exemplo é chegar o mais perto possível desses 2 arquivos ...

rm /tmp/foo.[cj]*

removeria arquivos como este ...

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

então incluiria muito mais do que apenas esses 2 arquivos.

    
por Rinzwind 20.07.2016 / 12:25
1

É um shell glob, semelhante aos curingas * e ? ... no bash, o padrão de nome de arquivo *.[co] corresponde a todos os nomes de arquivos que terminam com .c ou .o .

A diferença com *.[co] versus *.c *.o ou *.{c,o} é que os dois últimos padrões serão expandidos para um arquivo *.o se houver arquivos .o falsos no diretório, enquanto a versão *.[co] venceu t.

Shell globs são úteis para realizar operações de arquivos de maneira não sensível a maiúsculas e minúsculas. Por exemplo, se você tem um monte de arquivos com nomes de arquivos que terminam com jpg , JPG , Jpg , JPg , etc ... e você deseja remover todos eles, você pode fazer:

rm *.[Jj][Pp][Gg]
    
por delt 26.07.2016 / 19:45