posso usar operadores lógicos para remover todos os arquivos que correspondem a um e / ou outro padrão em uma única linha?

1

Desejo remover os arquivos .txt ou .csv em uma única linha.

O que eu tenho no meu diretório

tachomi$ ls
file1.csv  file1.sql  file1.txt  file2.csv  file2.sql  file2.txt

Eu quero apenas .sql arquivos, então quero saber se há uma maneira de executar comandos usando operadores lógicos como AND ou OR em uma única linha

tachomi$ rm *.txt AND *.csv
tachomi$ rm *.txt OR *.csv

Como remover todos os arquivos que correspondem a dois padrões fornecidos

    
por tachomi 05.11.2014 / 06:39

2 respostas

2

Simplesmente:

rm *.txt *.csv

E se o seu shell suportar a expansão de chaves, você pode:

rm *.{txt,csv}
    
por 05.11.2014 / 06:40
2

Basta listar os dois padrões se quiser corresponder arquivos que correspondam a um padrão, isto é, arquivos que correspondam a *.txt e arquivos que correspondam a *.csv ou, em outras palavras, arquivos que correspondam a *.txt ou *.csv . (O aninhamento de quantificadores e operadores lógicos é importante!)

rm *.txt *.csv

Observe que, se um padrão não corresponder a nenhum arquivo, ele permanecerá intacto, portanto rm reclamará que não é possível encontrar um arquivo chamado *.txt ou *.csv . Uma maneira comum de evitar uma reclamação é usar rm -f , que silenciosamente ignora arquivos inexistentes.

rm -f *.txt *.csv

Não há nenhum operador que corresponda a strings que correspondam ao padrão 1 e ao padrão 2. Nesse caso, não há string que corresponda a *.txt e *.csv .

Em ksh, o padrão @(*.txt|*.csv) ou *.@(txt|csv) corresponde a sequências que correspondem a *.txt ou *.csv . Você pode usar este padrão no bash se você executar shopt -s extglob primeiro; você pode usá-lo em zsh se executar setopt ksh_glob primeiro ou usar a sintaxe nativa *.(txt|csv) do zsh. Observe que, se não houver nenhum arquivo correspondente ao padrão composto, ele será transmitido para o comando como está. Em ATT ksh (e somente em ATT ksh, não em mksh, bash ou zsh), você pode usar ~(N)*.@(txt|csv) para expandir para uma lista vazia se nenhum arquivo corresponder ao padrão. Você ainda precisaria usar rm -f para que não haja reclamações sobre um argumento ausente.

rm -f ~(N)*.@(txt|csv)

No bash, execute shopt -s nullglob primeiro para fazer todos os padrões se expandirem para a lista vazia se eles não corresponderem a nada.

shopt -s nullglob extglob; rm -f *.@(txt|csv)

Em zsh, use o qualificador N glob ou execute setopt nullglob primeiro.

rm -f *.(txt|csv)(N)
setopt nullglob extglob; rm -f *.@(txt|csv)
    
por 07.11.2014 / 05:49