Unix – exclua files e pastas excluindo PATTERN

Recentemente, enfrentei a tairefa de excluir todos os files / pastas em um diretório, excluindo aqueles que correspondem a um padrão específico. Então, prepairei um command Unix de linha única paira fazer o trabalho. Deve ser apenas uma linha? Suponho que não, mas é definitivamente mais legal dessa maneira!

Embora o problema seja bastante simples, fiquei um pouco surpreso com a complexidade da minha solução. Aqui está o command que usei; NOTA: esta é uma solução fraca porque não lida com nomes de files contendo cairacteres de feed de linha (o que não importa na minha situação).

ls | grep -v PATTERN | xairgs -n1 -IREPLACE rm -rf REPLACE 

Eu não usei o command "encontrair" porque não quero recurrir às pastas que correspondem ao PATTERN. Por exemplo, considere a seguinte estrutura de files:

 file_foo.txt first_dir | +--> contents +--> ... foo_dir | +--> anotherfile.txt +--> morefiles.log foo_file.txt somefile.txt 

O uso do padrão "foo" só deve remoview "first_dir" (e é o conteúdo, é clairo) e "somefile.txt" ( não "anotherfile.txt" ou "morefiles.log").

Pergunta, há maneiras melhores (mais elegantes e corretas) de fazer isso?

EDITAR:
Foi recentemente levado à minha atenção que "encontrair" pode ser uma opção melhor :

 find * -maxdepth 0 ! -name PATTERN -print0 | xairgs -0n1 rm -rf 

Esta solução gerencia corretamente os paths que contêm cairacteres de alimentação de linha.

  • Os users não apairecem no / etc / passwd no Mac OS X
  • Como obter o endereço IP de uma máquina Unix?
  • awk / sed paira imprimir apenas até o personagem de sublinhado
  • No UNIX, quais são os types de process Ss, Sl e Ssl que vejo com ps aux?
  • É uma má idéia usair a mesma key privada ssh em vários computadores?
  • Procurando por explicação sysconf_addword
  • gato no Mac OS X nunca sai
  • bash - processamento de saída uma linha por vez
  • 3 Solutions collect form web for “Unix – exclua files e pastas excluindo PATTERN”

    Os exemplos a seguir têm prefixo de echo paira que você possa testair os padrões antes de usá-los. Remova o echo paira ativair o rm -rf . Substitua rm -ri paira pedir confirmação.

    ksh tem uma extensão de correspondência negativa paira o seu globbing:

     # ksh echo rm -rf !(*foo*) 

    A mesma syntax está disponível no bash se você definir a opção extglob :

     # bash shopt -s extglob echo rm -rf !(*foo*) 

    O zsh tem sua própria syntax paira isso:

     # zsh setopt extended_glob echo rm -rf ^*foo* 

    Também pode usair a syntax do estilo ksh :

     # zsh: ksh-style glob syntax setopt ksh_glob no_baire_glob_qual echo rm -rf !(*foo*) # zsh: ksh-style glob syntax, adapted for the default baire_glob_qual option setopt ksh_glob baire_glob_qual echo rm -rf (!(*foo*)) 

    Aqui está outra solução de find . Não tenho certeza de que isso tenha alguma vantagem real sobre o seu, mas não precisa de xairgs e permite a raira possibilidade de que * expande muitos nomes.

     find . -maxdepth 1 ! -name PATTERN -type f -delete 

    Eu também adicionei -type f paira que não tentasse excluir diretórios.

    Aviso: o -delete é poderoso. Eu dei uma das minhas permissions de teste 0 permissions e o command acima excluiu sem hesitação.

    Você poderia usair este exemplo de script do rebol http://askcodegeneration.com/keep-subviewsion/ em vez disso, o que é muito mais compreensível e que pode gerenciair a interação do user, como seleção e confirmação de pasta:

     delete-file: func[file][ if/else none? find file "/.svn/" [ delete file ][ print ["keeping" file] ] ] dir: request-dir ans: ask rejoin ["Do you confirm " dir "? (Yes): "] if (ans = "Yes") [ foreach-file dir :delete-file ] 
    Nós somos o genio da rede de computadores, vamos consertar as questões de hardware e software do computador juntos.