Evitar que rmdir -p atravesse um determinado diretório

1

Eu juntei este script para rsync de alguns arquivos em ssh . A opção --remove-source-files de rsync parece remover os arquivos transferidos, que é o que eu quero. No entanto, eu também quero que os diretórios desses arquivos sejam colocados também.

A parte atual do comando find , -exec rmdir -p {} ; tenta remover o diretório pai (neste caso, /srv/torrents ), mas falha porque não tem as permissões corretas. O que eu gostaria de fazer é impedir que rmdir passe por cima do diretório find , ou encontrar outra solução para se livrar de todas as pastas vazias. Pensei em usar algum tipo de loop com find e executar rmdir sem a opção -p , mas achei que não funcionaria.

Essencialmente, existe uma maneira alternativa de remover todos os diretórios vazios sob o diretório pai?

#!/bin/bash

HOST='<hostname>'
USER='<username>'
DIR='<destination directory>'
SOURCE='/srv/torrents/'

rsync -e "ssh -l $USER" --remove-source-files -h -4 -r --stats -m --progress -i $SOURCE $HOST:$DIR
find $SOURCE -mindepth 1 -type d -empty -prune -exec rmdir -p \{\} \;
    
por squircle 22.04.2010 / 17:23

2 respostas

1

Você pode usar o fato de que rmdir não removerá um diretório não vazio:

rmdir {,.}?*/ 2>/dev/null

ou, se a sua versão de rmdir tiver a opção:

rmdir --ignore-fail-on-non-empty {,.}?*/

O globo de aparência estranha se expande para incluir diretórios e diretórios ocultos, mas exclui . e .. .

Não é necessário usar find , a menos que você precise acessar os diretórios abaixo do nível atual.

Editar:

Tente:

find -type d -empty -delete

Isso faz uma pesquisa em profundidade e exclui todos os diretórios aninhados vazios.

    
por 22.04.2010 / 17:41
0

você também pode fazer

find $SOURCE -mindepth 1 -type d -empty -prune -print0 | xargs -0 rm -rf
    
por 22.04.2010 / 17:44