如何删除 ftp 服务器上的空文件夹?

如何删除 ftp 服务器上的空文件夹?

我正在使用以下脚本从我的远程种子箱自动下载文件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

现在,成功传输后文件会被删除,但会留下空文件夹。是否有任何方法/脚本代码可以自动删除空文件夹?

答案1

Linux 有一个内置工具可用于此目的rmdir

$ man rmdir
NAME
       rmdir - remove empty directories

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

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

您可以安全地运行类似的命令,rmdir *因为它只会删除空目录。

答案2

就我而言,这种方法rmdir -f *行不通,因此我必须寻找其他解决方案。

我遇到过这种情况:

在我的脚本中使用此命令进行镜像:

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

但这会在远程留下一个空的目录树,如下所示:

|-- 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

所以我将其添加到我的脚本中:

# 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

如果您想测试并查看 bash“for”命令实际上在做什么,您可以在 lftp 命令前添加“echo”,这样它就会打印它而不是实际执行它:

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

这种方法的缺点是它将打开许多 ftp 会话,实际上是每个要删除的目录都有一个会话...这可能不是最好的方法,但是...无论如何,这是我迄今为止发现的最好的方法:)

答案3

rmdir * 在 lftp 中无法正常工作,因为它不支持通配符扩展。可以使用下面的方法克服这个问题,需要一些蛮力才能删除嵌套文件夹:

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

我不建议使用 rm -rf 因为在执行镜像时添加的任何文件(以及任何传输失败的文件)都将被删除而不进行镜像。

以下代码将删除空文件夹(包括嵌套文件夹和包含空格的文件夹),保留未镜像的文件并在一个 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

相关内容