Como faço para "localizar" excluir a pasta em que ele pesquisa?

18

Estou executando o seguinte comando:

find /var/www/html/content/processing -type d -mtime +1 -exec rm -rf {} \;

Gostaria de excluir todas as pastas da processingpasta (a pasta de processamento nunca deve ser excluída).

O comando está excluindo a processingpasta também. Como limite o script para excluir apenas as pastas nessa pasta?

Elad Dotan
fonte
11
posterity: stackoverflow.com/questions/13525004/…
Trevor Boyd Smith

Respostas:

32

A maneira mais fácil seria apenas adicionar -mindepth 1, o que ignorará a primeira hierarquia de profundidade e, portanto, deixará de fora o diretório pai.

Além disso, você não precisa de uma -execchamada extra rm, apenas deleteas pastas diretamente, se estiverem vazias.

find /var/www/html/content/processing -mindepth 1 -type d -mtime +1 -delete

Se não estiverem vazios:

find /var/www/html/content/processing -mindepth 1 -type d -mtime +1 -exec rm -rf {} \;

Se você é preguiçoso, também pode expandir um curinga. Como *não inclui o diretório atual por padrão (a menos que dotglobesteja definido ), você também pode:

find /var/www/html/content/processing/* -type d -mtime +1 -delete

No entanto, isso também não incluiria pastas ocultas, novamente devido à dotglobopção.

slhck
fonte
Olá, recebo "find: warning: você especificou a opção -mindepth após um argumento não-option -type, mas as opções não são posicionais (-mindepth afeta os testes especificados antes e os especificados depois). Especifique as opções antes de outros argumentos. "e também" find: não é possível excluir `/ folder / 50d82faf0e09e ': o diretório não está vazio"
Elad Dotan
Adicione mindepth antes de digitar então. Para excluir os diretórios quando não estiverem vazios, você pode seguir a abordagem rm que tinha originalmente.
Slhck 5/05
4

O problema é que find retorna o diretório atual (.) Junto com os outros diretórios; portanto, ele exclui a pasta de processamento e os subdiretórios. Uma maneira rápida de contornar isso seria anexar a opção

-not -name .

que impede a localização do diretório atual e, por sua vez, impede que ele seja excluído.

Isso funcionaria se você estivesse executando o comando no diretório de processamento, para permitir o fato de estar usando um caminho absoluto:

-not -name /var/www/html/content/processing

E todo o comando seria:

find /var/www/html/content/processing -type d -mtime +1 -not -name /var/www/html/content/processing -exec rm -rf {} \;
Xenopático
fonte
O último comando está errado. -namerefere-se ao nome da base, ele nunca corresponde a nada com uma barra. Você provavelmente precisa usar -path.
Kamil Maciorowski
1

Já respondi, ainda gostaria de listar outra abordagem.

find /var/www/html/content/processing -mindepth 1 -maxdepth 1 -type d

Isso excluirá o diretório principal (e também os subdiretórios), e agora você pode aplicar qualquer comando que desejarmos aplicar sobre ele.

>> Opções:
-mindepth 1: Para excluir o diretório raiz
-maxdepth 1: Para evitar a análise de subdiretórios. (Para um cenário específico questionado, você não precisa disso).
-type d: lista apenas os tipos de diretório. Esta opção deve vir após o uso mindepth maxdepth.

prashant
fonte
Por que -maxdepth 1? Por que -type dduas vezes? Como isso é diferente da resposta aceita?
Attie
@ Attie: Obrigado, corrigiu o erro. maxdepth não é necessário, mas seria útil se você deseja evitar a listagem de subdiretórios.
Prashant #