Excluindo todos os arquivos em uma pasta, exceto os arquivos X, Y e Z

17

Eu tenho um monte de arquivos e pastas em uma pasta específica e quero excluir todos eles; no entanto, eu queria manter os arquivos X, Y e Z.

Existe uma maneira de fazer algo como: rm * | but NOT grep | X or Y or Z

    
por Amit 10.02.2011 / 23:43

7 respostas

15

Em vez de usar rm, pode ser mais fácil usar encontrar . Um comando como este excluiria tudo, exceto um arquivo chamado exatamente 'arquivo'

find . \! -name 'file' -delete

Muitas versões devem ser compatíveis com globbing e correspondência de expressões regulares.

Você também pode enviar a saída de find para rm também

find . \! -name '*pattern*' -print0 | xargs --null rm 
    
por 10.02.2011 / 23:55
9

Usando zsh, com setopt EXTENDED_GLOB , usando o operador ~ ( exceto )

rm -- *~(x|y|z)

ou ^ operator (negation):

rm -- ^(x|y|z)

Mas, provavelmente, você deve mover os arquivos para outro local e excluir tudo. É muito mais seguro em termos de deslizes de dedo, como entrar muito cedo.

    
por 11.02.2011 / 00:01
5

Versões posteriores do bash têm a opção extglob shell que lhe dá uma sintaxe para fazer o que você quer (verifique sua página man em "Expansão do nome do caminho" para ver se sua versão instalada tem):

$ shopt -s extglob  # turn on extended globbing
$ rm !(X|Y|Z)

Para testar, sugiro que você primeiro substitua rm por echo para ver se a lista de arquivos a serem excluídos é o que você espera.

    
por 12.02.2011 / 07:24
5
ls -1 | grep -v "^[XYZ]$" # | xargs rm -r

Atenção: Execute o comando e, se os arquivos a serem excluídos forem os corretos, execute-o novamente e exclua o caractere de hash "#".

Se os nomes dos arquivos forem mais complicados, faça

ls -1 | egrep -v "^file1$|^filename2$|^f1le$" # | xargs rm -r

Novamente, primeiro examine os resultados e remova o sinal de hash.

Esta versão - como sugerido nos comentários - salva alguns caracteres e parece um pouco mais clara.

ls -1 | egrep -v "^(file1|filename2|f1le)$" # | xargs rm -r
    
por 11.02.2011 / 11:35
3

Mova os arquivos que você deseja manter. Suba um nível, exclua a pasta. Recrie a pasta e mova esses arquivos de volta.

    
por 11.02.2011 / 00:01
0

Isso é o que eu configurei como um script .sh para um gancho de logoff do OSX / MacOS, funciona bem o suficiente.

#! /bin/bash
for dir in /PathToFolder/*
 do
    if [ ! "$dir" = "/PathToFolder/FolderToKeep1" ] && [ ! "$dir" = "/PathToFolder/FolderToKeep2" ] && [ ! "$dir" = "/PathToFolder/FolderToKeep3" ] && [ ! "$dir" = "/PathToFolder/FolderToKeep4" ] && [ ! "$dir" = "/PathToFolder/FolderToKeep5" ] && [ ! "$dir" = "/PathToFolder/FolderToKeep6" ] ; then 
      echo ${dir}
      sudo rm -R $dir user
      dscl . -delete $dir
    fi 
  done

exit 0
    
por 13.09.2017 / 14:21
0

Com o GNU-find você pode usar a opção -delete, que remove diretórios, se estiver vazia, também:

 find tmp -not -name X -not -name Y -not -name Z -delete 
    
por 11.02.2011 / 10:57