Preciso excluir todos os arquivos em um diretório, mas excluir alguns deles. Por exemplo, em um diretório com os arquivos a b c ... z, preciso excluir todos, exceto ue p. Existe uma maneira fácil de fazer isso?
Preciso excluir todos os arquivos em um diretório, mas excluir alguns deles. Por exemplo, em um diretório com os arquivos a b c ... z, preciso excluir todos, exceto ue p. Existe uma maneira fácil de fazer isso?
Respostas:
O que faço nesses casos é digitar
rm *
Em seguida, pressiono Ctrl+ X, *para expandir * para todos os nomes de arquivos visíveis.
Depois, basta remover os dois arquivos que gosto de manter da lista e finalmente executar a linha de comando.
*também se expande não está ficando muito longa. : -}
Ctrl+ Shift+ x+*
Para rmtodos, exceto u,pno bash, basta digitar:
rm !(u|p)
Isso requer que a seguinte opção seja configurada:
shopt -s extglob
Ver mais: glob - Wiki de Greg
shopt -s extglob, @Ashot. Além disso, são apenas arquivos, não diretórios, e é por isso que removi as -rfopções do seu comando.
rm !(index).html. Isso excluirá todos os arquivos que terminam em ".html", com a exceção de "index.html".
Você pode usar find
find . ! -name u ! -name p -maxdepth 1 -type f -delete
! nega a próxima expressão-name especifica um nome de arquivo-maxdepth 1fará do processo find apenas o diretório especificado ( findpor padrão, percorre os diretórios)-type f processará apenas arquivos (e não por exemplo diretórios)-delete excluirá os arquivosVocê pode ajustar as condições na página de manual do find
Atualizar
Teste seu comando primeiro usando em -printvez de-delete
find . ! -name u ! -name p -maxdepth 1 -type f -print-deletelogo após .será desastre (irá apagar todos os arquivos em CWD)
find . -maxdepth 1 -type f -name '[^up]' -delete
findé meu melhor amigo, especialmente quando há muitos arquivos para glob
Simples:
mvos arquivos que você deseja em um diretório superior, rmo diretório e depois mvos retorna.
rmsem -r, não removerá subdiretórios.
Um pouco semelhante a esta resposta, mas nenhuma opção especial é necessária, até onde eu sei o seguinte é uma funcionalidade "antiga" suportada por qualquer shell (vagamente) / bin / sh (por exemplo, bash, zsh, ksh, etc)
rm [^up]
rm [^up]*? Faço coisas semelhantes com bastante frequência.
Fazendo isso sem encontrar:
ls | grep -v '(u|p)' | xargs rm
(Edite: "u" e "v", como em outros lugares aqui, estão sendo usados como versões genéricas de regexes inteiras. Obviamente, você deve ter cuidado para ancorar suas regexes para evitar a correspondência de muitas coisas.)
Você definitivamente vai querer um script se estiver fazendo muito disso, como outros sugeriram.
-Eoregrep
uou ump
grep -L (u|p)' * | xargs rmwhere -Lsignifica que os nomes de arquivos da lista não contêm uma correspondência.
uou pnão qualquer arquivo que contenha a uou a p. Está correto. Você pode corrigir usandoegrep -v '^(u|p)$'
ls | grep -v 'vuze\|progs' | xargs rm -rf
Na era do disquete, eu tinha um executável DOS chamado "Except", que movia temporariamente as coisas para fora do diretório atual e executava um comando, para que você pudesse dizer:
exceto * .txt del *. *
para excluir tudo, menos seus arquivos de texto.
Isso seria uma coisa bastante trivial para implementar como um script de shell e, se esse é o tipo de coisa que você provavelmente fará mais do que o dobro, parece que seria uma boa idéia.
find . -maxdepth 1 ! -name "u" ! -name "p" -type f -exec rm -rf {} \;
Isso excluirá todos os arquivos, exceto u e p no unix
Para aqueles que preferem especificar padrões de exclusão complexos arbitrários (abrangendo todos os nomes de arquivos afetados) em um estilo completo de eMexs de regexp, posix-awk ou posix-extended (consulte a página de manual de localização), eu recomendaria este. Exclui ue pno dir atual neste exemplo. Isso pode ser útil para scripts.
find -regextype posix-awk ! -regex './(u|p)' -print0 | xargs -0 rm -rf
-regextypesó funciona em versões GNU
findé uma extensão de findcomando GNU . O mesmo se aplica à -regextypeopção. Além disso, seu comando excluirá os arquivos nos subdiretórios também, enquanto a pergunta original claramente perguntou sobre os arquivos em um diretório.
Ainda outra:
for FILE in ./*; do if [[ $FILE != ./u* ]] || [[ $FILE != ./p* ]];then rm $FILE; fi; done;
É meio demorado e não sei se você poderia transformá-lo facilmente em uma função que poderia acomodar facilmente um número arbitrário de argumentos, mas funciona bem.
E é pura bondade.
Aqui está outra variante. Você pode digitar:
rm -i *
ou:
rm --interactive *
Então rm, você deverá confirmar a exclusão de cada arquivo.
Usar:
find . -type f ! -name 'u' ! -name 'p' ! -name '*.ext' -delete
find . -type d ! -name 'u' ! -name 'p' ! -name '*.ext' -delete
para excluir todos os arquivos, incluindo os diretórios, exceto os arquivos u, pe .ext.
Uma maneira simples e difícil de estragar: digamos que você queira excluir tudo, exceto * .pdf:
mkdir tmp
mv *.pdf tmp
rm *
mv tmp/* .
rm -r tmp