Eu tenho muitos 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
command-line
rm
Amit
fonte
fonte
Respostas:
Em vez de usar rm, pode ser mais fácil usar o find . Um comando como esse excluiria tudo, exceto um arquivo chamado exatamente 'arquivo'
Muitas versões do devem poder suportar globbing e correspondência de expressão regular.
Você também pode canalizar a saída de find para rm também
fonte
-delete
arquivos e quais serão salvos removendo-delete
e\!
.find
é recursivo! para que todos os subdiretórios de arquivos que não correspondam ao ' padrão ' sejam excluídos tambémUsando zsh, with
setopt EXTENDED_GLOB
, usando o~
operador ( exceto )ou
^
operador (negação):Mas você provavelmente deve mover os arquivos para outro lugar e excluir tudo. É muito mais seguro em termos de deslizamentos de dedos, como pressionar Enter muito cedo.
fonte
Versões posteriores do bash têm a
extglob
opção de shell que fornece uma sintaxe para fazer o que você deseja (verifique sua página de manual em "Expansão do nome do caminho" para ver se a versão instalada possui):Para testar, sugiro que você primeiro substitua
rm
porecho
para ver se a lista de arquivos a serem excluídos é o que você espera.fonte
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 isso.
Novamente, primeiro observe 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.
fonte
egrep
argumento para"^(file1|filename2|f1le)$"
a
,b
ea b
o primeiro programa for excluído - se você colocar ab na parte grep:"^[ab]$"
a
e,b
mas nãoa b
, oponha-se apenas às suas intenções. O segundo comando fará o mesmo. E o terceiro também. Você não deve usar 'ls' em scripts, com exceções muito, muito raras. Apenas não faça isso.Mova os arquivos que você deseja manter longe. Suba um nível, exclua a pasta. Recrie a pasta e mova esses arquivos de volta.
fonte
/
, hein? Não é muito prático. c) Tentar remover todos os arquivos do seu$HOME
computador também não é prático.Isto é o que eu configurei como um script .sh para um gancho de logout do OSX / MacOS, funciona bem o suficiente.
fonte
Com o GNU-find, você pode usar a opção -delete, que remove os diretórios, se vazios também:
fonte
find tmp -maxdepth 1 -not -name X -not -name Y -not -name Z -delete
é uma maneira de contornar isso.tmp
se não houver arquivosX
/Y
/Z
. Nota!
como o equivalente padrão de GNU do-not
(-delete
também é uma extensão GNU)