use rm para remover arquivos e diretórios recursivamente


17

é possível usar o rm para remover arquivos e diretórios correspondentes a um padrão recursivamente sem usar outros comandos?

Respostas:


35

Para responder diretamente à sua pergunta, "não - você não pode fazer o que descreve rm".

Você pode , no entanto, fazê-lo você combiná-lo com find. Aqui está uma das muitas maneiras pelas quais você pode fazer isso:

 # search for everything in this tree, search for the file pattern, pipe to rm
 find . | grep <pattern> | xargs rm

Por exemplo, se você quiser destruir todos os arquivos * ~, poderá fazer o seguinte:

 # the $ anchors the grep search to the last character on the line
 find . -type f | grep '~'$ | xargs rm

Para expandir a partir de um comentário * :

 # this will handle spaces of funky characters in file names
 find -type f -name '*~' -print0 | xargs -0 rm

1
verdade - se você deixar-out o último tubo, você terá uma lista de tudo primeiro :)
Warren

2
Pode não responder diretamente à pergunta do pôster, mas é o mais próximo que eles podem chegar do que desejam.
Drakia 27/10/09

1
Anão, isso não é um pouco amargo sem motivo?
Gnoupi 27/10/09

10
Por favor, tenha muito cuidado usando find | grep | xargs rm. Se houver arquivos com espaços (ou novas linhas), isso será interrompido (e dependendo dos nomes dos arquivos e de onde estão os espaços) pode excluir itens que você não pretendia excluir. find … -print0 | xargs -0 rmserá muito mais robusto. No entanto, isso significa que você não pode usar grepe deve usar findos predicados para corresponder e imprimir0 apenas os arquivos desejados. segundo exemplo de warren será mais robusto como find -type f -name '*~' -print0 | xargs -0 rm.
31420 Chris Johnsen

1
Se você deseja que um único comando faça o trabalho, crie um alias usando um dos comandos de busca fornecidos. Irá preencher uma resposta para isso mais tarde, se desejado.
casualuser

8

"sem usar outros comandos"

Não.


Boa resposta ilustrando o debate "responda estritamente à pergunta inicial (correndo o risco de não ser capaz de fornecer uma solução)" vs. "forneça uma solução, mesmo que ela não corresponda estritamente às restrições impostas".
Gnoupi 27/10/09

Eu apenas publiquei isso como "Um anão" estava reclamando da resposta que realmente forneceu uma solução. Sem usar outros comandos, realmente não há como fazer a exclusão recursiva de arquivos que corresponda a um padrão, apenas a exclusão do arquivo / diretório do diretório atual.
Drakia 27/10/09

3

Usando Bash, com globstarset, yes :

rm basedir/**/my*pattern*

Experimente com, por exemplo ls -1, primeiro, antes rmde listar os arquivos correspondentes.

Você define opções através de, por exemplo shopt -s globstar.


Como alternativa, uma findvariante mais curta :

find -type f -name 'my*pattern*' -delete

ou para GNU find:

find -type f -name 'my*pattern*' -exec rm {} +

ou outra alternativa para não-GNU find(um pouco mais lento):

find -type f -name 'my*pattern*' -exec rm {} \;

Para também remover diretórios, como você pedir: apenas mudança rmem rm -rnos comandos acima e pule correspondente na única -type fnos findcomandos.


0

Eu teria aspirado "rm -rf" onde está uma combinação de nomes de arquivos e padrões correspondentes como * e? etc (por exemplo, hoje_log_2009 ????. log). Isso começará no Dir atual e funcionará para baixo, removendo recursivamente os arquivos que afetam esse padrão.


Isso não funcionará porque o padrão é expandido pelo shell no diretório atual. Se citado, o padrão se torna um nome de arquivo com caracteres especiais. por exemplo, para excluir o arquivo [, pode-se escrever rm '['. O padrão simplesmente perde seu significado.
casualuser

0

Se você usar zsh (1) , ative "globbing estendido" com setopt extendedglobem .zshrc. Prefixar o padrão com '** /' excluirá recursivamente:

% rm -rf ** / <padrão>

No entanto, se houver muitos arquivos a serem excluídos, você deve procurar (1) com xargs (1) ou -exec, e eu também recomendo fazer isso em scripts de shell.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.