Digamos que tenho dois arquivos em /tmp
:
root@ubuntu:~# touch /tmp/hello.{pyc,py}
root@ubuntu:~# ls /tmp/
hello.py hello.pyc
Agora, vamos executar o rm -rf
comando com a opção [co]
root@ubuntu:~# rm -rf /tmp/hello.py[co]
root@ubuntu:~# ls /tmp/
hello.py
Alguém por favor pode explicar o que está acontecendo aqui? Qual é o [co]
parâmetro? Como podemos fazê-lo funcionar para outras extensões? Digamos que eu possua foo.js
e foo.coffee
arquivos, podemos fazer algo como rm -rf /tmp/foo.coffe[co]
excluir o /tmp/foo.js
?
command-line
bash
rm
aneeshep
fonte
fonte
-rf
disso, pois esses não são diretórios (--recursive
) nem graváveis (--force
).-rf
e não há necessidade de fazer as coisas como raiz. Especialmente se as coisas em questão envolveremrm -rf
.[co]
shell glob. Obrigado.Respostas:
[co]
não é um parâmetro para orm
comando - é um shell glob que corresponde a um padrão igual a um único caractere do conjunto[co]
- em outras palavras, corresponde ac
ouo
a ao final do nome do arquivo. Deman bash
:Para corresponder a ambos
foo.coffee
efoo.js
, como os sufixos não contêm substrings comuns, o melhor que você pode fazer é ofoo.*
que corresponderia a qualquer nome de arquivo começando comfoo.
Em vez disso, você poderia usar a expansão de chaves, por exemplofonte
[abc]
ou*
vai procurar arquivos enquanto{}
não. vá para / tmp, digite eecho nya[ab]; echo nya{a,b}
, em seguida,touch nyaa
novamenteecho nya[ab]; echo nya{a,b}
Não é um parâmetro, mas uma coleção de letras (ou um "shell glob"). Esse é o mesmo:
é o mesmo que
Semelhante ...
excluiria qualquer coisa,
/tmp/hello.pyc
incluindo as/tmp/hello.pyo
seguintes ordens ASCII.removeria ...
Você pode criar métodos bastante sofisticados, mas para esses 2 arquivos eu os removeria com 1 comando para cada um. Outro exemplo, chegando o mais próximo possível desses 2 arquivos ...
removeria arquivos como este ...
portanto, incluiria muito mais do que apenas esses dois arquivos.
fonte
rm -rf
todas as correspondências, poucas invocações cada uma com uma correspondência.É 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 modelo,*.o
se não houver.o
arquivos no diretório, enquanto a*.[co]
versão não.Os globs do shell são úteis para executar operações de arquivo de maneira que não diferenciam maiúsculas de 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:fonte