Como apagar pastas vazias no servidor ftp?

0

Estou usando o seguinte script para fazer o download automático de arquivos da minha seedbox remota usando lftp :

set ftp:list-options -a
set ftp:ssl-allow no
set mirror:use-pget-n 5
set cmd:fail-exit true
open ftp.myseedbox.com
mirror -c -P5 --Remove-source-files --log=synctorrents.log /completed /media/ExternalHd/
quit

Agora, isso remove os arquivos após a transferência bem-sucedida, mas deixa as pastas vazias. Existe algum código de método / script para remover automaticamente as pastas vazias?

    
por DeepeshAgarwal 21.11.2012 / 15:01

3 respostas

2

O Linux tem uma ferramenta embutida para isso, rmdir :

$ man rmdir
NAME
       rmdir - remove empty directories

SYNOPSIS
       rmdir [OPTION]... DIRECTORY...

DESCRIPTION
       Remove the DIRECTORY(ies), if they are empty.

Você pode executar com segurança um comando como rmdir * , já que ele só removerá os diretórios vazios.

    
por 21.11.2012 / 15:10
1

No meu caso rmdir -f * não funcionou e eu tive que encontrar outra solução.

Eu tive essa situação:

espelhamento com este comando no meu script:

lftp -u ${FTPUSER},${FTPPASS} ${FTPHOST} -e "mirror --depth-first --no-empty-dirs --Remove-source-files --verbose . ${MYLOCALFOLDER} ; bye" >> $LOG 2>&1

mas isso deixou uma árvore vazia de diretórios como este no remoto:

|-- 693
|   '-- 2014-01-06
|-- 75
|   |-- 2014-01-10
|   |-- 2014-01-11
|   |-- 2014-01-12
|   |-- 2014-01-13
|   |-- 2014-01-14
|   |-- 2014-01-15
|   '-- 2014-01-16
|-- 811
|   |-- 2014-01-07
|   |-- 2014-01-08
|   |-- 2014-01-09
|   |-- 2014-01-10
|   |-- 2014-01-11
|   |-- 2014-01-12
|   |-- 2014-01-13
|   |-- 2014-01-14
|   |-- 2014-01-15
|   '-- 2014-01-16

então adicionei isso ao meu script:

# create a local mirror with the empty dir structure                                                                   
mkdir /tmp/lftp_emptydirlist
cd /tmp/lftp_emptydirlist
lftp -u ${FTPUSER},${FTPPASS} ${FTPHOST} -e "mirror ;bye"

# sort -r is to reverse and leave the empty parent dirs at the end. 
# egrep will strip the "." directory from the list   
find|sort -r|egrep -v '^.$' > /tmp/emptydirlist.txt

# remove remote empty directories                                                                                      
for i in $(cat /tmp/emptydirlist.txt) do
   lftp -u ${FTPUSER},${FTPPASS} ${FTPHOST} -e "rmdir -f $i; bye"
done

# remove local empty directories                                                                                        
find ${MYLOCALFOLDER} -type d -empty -delete

Se você quiser testar e ver o que o comando bash 'for' está realmente fazendo, você pode adicionar um 'eco' antes do comando lftp, então ele irá imprimi-lo em vez de fazê-lo:

for i in $(cat /tmp/emptydirlist.txt); do echo lftp -u ${FTPUSER},${FTPPASS} ${FTPHOST} -e "rmdir -f $i; bye"; done

O lado negativo dessa abordagem é que ela abrirá muitas sessões ftp, na verdade uma sessão para cada diretório a ser removido ... o que provavelmente não é o melhor caminho, mas ... é a melhor maneira que encontrei até agora: )

    
por 16.01.2014 / 13:21
1

rmdir * não funciona corretamente no lftp, pois não suporta expansão de curingas. Pode-se superar isso usando o abaixo, alguma força bruta é necessária para remover pastas aninhadas:

glob -a rmdir /remote/directory/*/*/*
glob -a rmdir /remote/directory/*/*
glob -a rmdir /remote/directory/*

Eu não recomendo usando rm -rf como qualquer arquivo adicionado enquanto o espelho está sendo executado (e quaisquer arquivos que falharam na transferência) serão removidos sem espelhamento.

Aqui está o código que removerá as pastas vazias (incluindo aninhadas e pastas contendo espaços), preservando os arquivos que não foram espelhados e faz tudo em uma sessão Lftp:

lftp -p $port -u $login,$pass sftp://$host <<-EOF
cd "$remote_dir"
find . | grep [[:alnum:]] | sed -e 's~.~rmdir" "-f" "\".~' -e 's~$~\"~' | tac > /tmp/delete
mirror -v --no-empty-dirs --Remove-source-files -c -P3 $remote_dir $local_dir
source /tmp/delete
quit
EOF
    
por 11.02.2015 / 20:24