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 u
e 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 u
e 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 rm
todos, exceto u,p
no 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 -rf
opçõ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 1
fará do processo find apenas o diretório especificado ( find
por 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 -print
vez de-delete
find . ! -name u ! -name p -maxdepth 1 -type f -print
-delete
logo 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:
mv
os arquivos que você deseja em um diretório superior, rm
o diretório e depois mv
os retorna.
rm
sem -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.
-E
oregrep
u
ou ump
grep -L (u|p)' * | xargs rm
where -L
significa que os nomes de arquivos da lista não contêm uma correspondência.
u
ou p
não qualquer arquivo que contenha a u
ou 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 u
e p
no dir atual neste exemplo. Isso pode ser útil para scripts.
find -regextype posix-awk ! -regex './(u|p)' -print0 | xargs -0 rm -rf
-regextype
só funciona em versões GNU
find
é uma extensão de find
comando GNU . O mesmo se aplica à -regextype
opçã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