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