Exclua tudo, exceto algumas extensões

5

Posso modificar o comando rm com expressão regular ou algo para excluir. todos os arquivos no diretório atual, exceto arquivos com extensões *.bmp , *.wav e *.png ? Deve ser insensível a maiúsculas e minúsculas porque existem arquivos como *.BMP ou *.bMP .

    
por xralf 27.12.2011 / 14:52

4 respostas

11

O @ChrisDown forneceu uma bash solution que leva em conta a diferença de arquivos e diretórios, e também se não há arquivo para remover.

Dado que rm falharia, no entanto, nessas situações, o comando poderia ser simplificado como (ainda com bash ):

shopt -s extglob nocaseglob
rm -- !(*.bmp|*.wav|*.png)

Lembre-se de redefinir as duas opções de shell para seus valores padrão. No meu caso extglob já está definido em shells interativos, então eu só preciso

shopt -u nocaseglob

Ou execute esses dois comandos em um subshell:

(shopt -s extglob nocaseglob
rm -- !(*.bmp|*.wav|*.png))

Se você gostaria de ver com antecedência quais arquivos serão removidos, basta substituir o rm por echo .

Se você quiser que os arquivos ocultos também sejam removidos, adicione a opção dotglob .

    
por 27.12.2011 / 18:03
5

Se você estiver usando bash , poderá usar uma combinação de extglob e nocaseglob .

shopt -s extglob nocaseglob
for file in !(@(*.bmp|*.wav|*.png)); do
    [[ -f "${file}" ]] && files+=( "${file}" )
done
(( ${#files[@]} )) && rm "${files[@]}"

Caso contrário, você pode nos algo como o seguinte:

find . -maxdepth 1 -type f ! \( -iname '*.bmp' -o -iname '*.wav' -o \
    -iname '*.png' \) -delete
    
por 27.12.2011 / 15:14
3

Com zsh , para remover os arquivos regulares que não sejam os .bmp , .png , .wav (sem insensibilidade):

setopt extendedglob # best in ~/.zshrc
rm -- *.^(#i)(png|bmp|wav)(D.)

(remova o D acima se quiser preservar os arquivos ocultos, independentemente de sua extensão).

    
por 26.08.2015 / 16:01
0

Sugiro que você reserve um pouco de tempo e faça isso em várias etapas para não fazer nada acidentalmente bobo.

  1. crie um comando para identificar os arquivos que você deseja excluir, por exemplo,

        ls | grep -v *.bmp | grep -v *.wav  # current directory
    

    ou

        find . -type f | grep -v *.bmp      # current and sub directories
    

    se a lista de arquivos retornados for o que você deseja remover,

  2. lembre-se do último comando e adicione o comando xargs rm , por exemplo

        ls | grep -v *.bmp | grep -v *.wav | xargs rm
    
por 27.12.2011 / 22:03