Remove todos os tipos de filety menos um (ou mais)

20

Estou tentando encontrar um comando para remover todos os arquivos de uma pasta, mas não um tipo de arquivo. Mas parece que não tenho sorte. O que eu tentei até agora:

set extended_glob
rm !(*.dmg)
# this returns zsh:number expected

rm ./^*.dmg
# this returns no matches found 

A versão do zsh que estou usando é zsh 5.0.2 (x86_64-apple-darwin13.0.1) .

    
por nXqd 24.11.2013 / 16:44

3 respostas

18

A opção extended_glob oferece a você o prorrogado do zsh intaxe de globo .

setopt extended_glob
rm -- ^*.dmg
rm -- ^*.(dmg|txt)

Você pode definir a opção ksh_glob para obter ksh globs . Tenha em atenção que, no caso comum em que o padrão negativo é a última coisa na palavra, zsh pode analisa os parênteses como qualificadores glob (não faz isso no modo de emulação ksh).

setopt ksh_glob
rm -- !(*.dmg|*.txt)
setopt no_bare_glob_qual
rm -- !(*.dmg)
    
por 24.11.2013 / 22:25
5

Você pode usar find em vez de seu shell:

find . -mindepth 1 -maxdepth 1 ! -name "*.dmg" -delete

De man find :

   ! expr True  if  expr  is false.  This character will also usually need
          protection from interpretation by the shell.
   -name pattern
          Base of file name (the path with the leading directories removed)
          matches shell pattern pattern. 
   -delete
          Delete  files; true if removal succeeded.  If the removal failed,
          an error message is issued.  If -delete fails, find's exit status
          will be nonzero (when  it eventually exits).  Use of -delete 
          automatically turns on the -depth option.

Se você não pode usar find por qualquer motivo, aqui está uma maneira de fazer isso com zsh (ou outros shells). zsh sendo zsh , provavelmente existe uma maneira mais simples de fazer isso, mas como sou um cara bash , foi isso que eu criei:

for file in *; do if [[ ! "$file" == *.dmg ]]; then rm $file; fi; done
    
por 24.11.2013 / 16:47
3

Outra maneira de remover arquivos é com find , xargs e rm :

find . -mindepth 1 -maxdepth 1 ! -name '*.dmg' -print0 | xargs -0 rm
    
por 24.11.2013 / 20:28

Tags