Eu me deparei com padrões esbugalhados e curingas e é particularmente interessante para mim [!]
.
Essa construção é semelhante à
[!]
construção, exceto que, em vez de corresponder a qualquer caractere dentro dos colchetes, ela corresponderá a qualquer caractere, desde que não esteja listada entre[
e]
.
rm myfile [!192]
O que eu acredito acima removerá todos os arquivos, exceto todos os arquivos com 192 em seu nome.
No entanto, estou preocupado com o uso adequado disso com uma extensão de arquivo e, em particular, com várias condições.
Qual seria a sintaxe apropriada em tal situação?
rm myfile [!.gif .csv. mp3]
ou
rm myfile [!.gif !.csv !.mp3]
Minha preocupação é que o período possa ser extraviado e, portanto, qualquer arquivo com um .
(que certamente seria um deles?) Seria manipulado quando estou procurando causar a manipulação de arquivos específicos.
Essa construção é semelhante à [ ]
construção, exceto que, em vez de corresponder a qualquer caractere dentro dos colchetes, ela corresponderá a qualquer caractere, desde que não esteja listada entre [
e ]
.
(citado em http://www.tldp.org/LDP/GNU-Linux-Tools-Summary/html/x11655.htm )
Agora; para mim, isso sugere que um singular !
é suficiente, e todos os valores a seguir são contidos no intervalo.
fonte
ls my-pattern
ouecho my-command
para verificar se o englobamento é feito da maneira que quiser, antes de executarrm
[!]
é semelhante, mas não como[!]
^
tem exatamente o mesmo significado que!
neste contexto, portanto[^a]
excluia
exatamente como[!a]
faz: Se o primeiro caractere após o [for a! ou a ^, qualquer caractere não incluído é correspondido. (man bash
)rm myfile [!192]
irá removermyfile
, bem como qualquer arquivo de um único caractere não nomeado1
,9
ou2
.Respostas:
Citação
man 7 glob
:A ênfase na parte de um único caractere aqui
[]
não pode ser usada para seqüências de caracteres inteiras no Bash Pattern Matching.bash
A expansão de chaves pode ser usada para corresponder às strings, mas não há como (eu sei) negá-las. Por exemploé expandido para
não importa se esses arquivos existem.
Como o wchargin apontado
shopt
pode ser usado para habilitar operadores estendidos de correspondência de padrões, sendo um deles!()
. Após a execuçãoshopt -s extglob
, por exemploé expandido para
se esses arquivos existirem no diretório atual. Para mais, leia
man bash
(seção EXPANSÃO / Expansão do nome do caminho) e Expansão do nome do caminho (globbing) .Para o que você está tentando fazer, eu sempre usaria
find
, o que oferece a negação e muito mais, por exemplo, da seguinte maneira:Isso apenas lista as descobertas; se você deseja removê-las, basta anexar a
-delete
opção ao final do comando. Como sempre com a remoção de ações: sempre verifique cuidadosamente primeiro .find
oferece uma tonelada de opções úteis muito bem explicadas porman find
.fonte
find
comando é recursivo ( edite: como foi mostrado originalmente - eu posso manter esse comentário para obter informações adicionais relevantes, mas não essenciais, que ele transmite). Para localizar arquivos que residem apenas no diretório atual, mas não também em seus subdiretórios - e, portanto, exclua esses arquivos apenas se a-delete
ação for adicionada - você pode adicionar-maxdepth 1
imediatamente depoisfind .
. Isso o alinharia com o efeito de globbing, pois os globs não são recursivos no Bash, a menos que aglobstar
opção de shell esteja ativada e**
usada. O globo mostrado na pergunta não é recursivo em todas as conchas.shopt -s extglob
, você pode usarecho 1.!(gif|csv|mp3)
, que imprime tudo1.ext
, ondeext
não égif
,csv
oump3
. (Consulte a subseção "Correspondência de padrões" deman bash
.)Eu acho que você não entendeu o uso de colchetes.
[abc]
corresponde a um dos caracteresa
,b
ouc
.[!abc]
corresponde um personagem que é nãoa
,b
ouc
. Então o comandoirá remover
myfile
e os arquivos1
,9
e2
porque você tem um espaço entre o myfile e o suporte. Por outro lado, o comandoirá remover os arquivos
myfile1
,myfile9
emyfile2
.fonte
find
.Parênteses
[
]
indicam uma classe de personagem. Qualquer caractere único dentro deles pode corresponder na posição especificada. assimcorresponde a três nomes possíveis:
Ele não corresponder
file192
, porque só lida com o caráter único apósfile
.Também podemos usar faixas entre parênteses.
[0-9]
corresponde a qualquer dígito na posição especificada. Para dois dígitos, precisamos[0-9][0-9]
. Para um dígito seguido de uma letra maiúscula, poderíamos usar[0-9][A-Z]
...!
indica negação.corresponderá a arquivos que possuem um único caractere depois de
file
exceto1
ou9
ou2
. Por exemplo, ele corresponderáfile7
efiles
efile%
(e muitos outros), mas nãofile192
, porque isso possui dois caracteres extras.Para o seu caso de uso, sugiro usar em
find
vez de[!]
. Tem umnot
operador.Também é recursivo , o que significa que entra em todos os subdiretórios por padrão. Você pode limitá-lo ao diretório atual com
-maxdepth 1
, se é isso que você deseja. Os curingas do shell (globbing) não são recursivos (embora o globbing recursivo**
possa ser ativado).Supondo que você não queira evitar a exclusão de links simbólicos, podemos adicionar
-type d
aos testes negados para evitar a exclusão de diretórios. Agradeço a Eliah Kagan por essa sugestão.Se você vir o que deseja, poderá executar o comando novamente com
-delete
fonte
[0-9a-fA-F]