我把这个脚本拼凑到了rsync
一些文件上ssh
。--remove-source-files
选项rsync
似乎会删除它传输的文件,这正是我想要的。但是,我还希望这些文件所在的目录也消失。
find
该命令的当前部分-exec rmdir -p {} ;
尝试删除父目录(在本例中为/srv/torrents
),但由于没有正确的权限而失败。我想要做的是停止rmdir
遍历find
运行目录,或者找到另一种解决方案来删除所有空文件夹。我曾考虑过使用某种循环,并在不使用开关的情况下find
运行,但我认为这行不通。rmdir
-p
本质上,有没有其他方法可以删除父目录下的所有空目录?
#!/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 \{\} \;
答案1
您可以利用rmdir
不会删除非空目录的事实:
rmdir {,.}?*/ 2>/dev/null
或者,如果你的版本rmdir
有以下选项:
rmdir --ignore-fail-on-non-empty {,.}?*/
这个看起来很奇怪的 glob 扩展为包含常规目录和隐藏目录,但排除.
和..
。
find
除非您需要获取当前级别以下的目录,否则您不必使用。
编辑:
尝试:
find -type d -empty -delete
这将进行深度优先搜索并删除所有空的嵌套目录。
答案2
你也可以
find $SOURCE -mindepth 1 -type d -empty -prune -print0 | xargs -0 rm -rf