我使用 rsync 复制包括文件在内的目录,使用 --remove-source-files 让 rsync 删除源文件。不幸的是它不会删除目录所以我想删除所有空目录在下面源 1 和源 2。 find -exec rmdir 命令可以执行此操作,但不幸的是它也会删除 SOURCE 目录本身
复制.sh
SOURCE1="/mnt/download/transmission/complete/"
SOURCE2="/mnt/download/sabnzbd/completed/"
sudo rsync --remove-source-files --progress --ignore-existing -vr /mnt/download/transmission/complete/ /mnt/dune/DuneHDD_1234
sudo rsync --remove-source-files --progress --ignore-existing -vr /mnt/download/sabnzbd/completed/ /mnt/dune/DuneHDD_1234
find $SOURCE1 -not -name "complete" -type d -empty -prune -exec rmdir --ignore-fail-on-non-empty -p \{\} \;
find $SOURCE2 -not -name "completed" -type d -empty -prune -exec rmdir --ignore-fail-on-non-empty -p \{\} \;
我也尝试了以下代码
*
find $SOURCE1 -mindepth 2 -type d -empty -prune -exec rmdir --ignore-fail-on-non-empty -p \{\} \;
find $SOURCE2 -mindepth 2 -type d -empty -prune -exec rmdir --ignore-fail-on-non-empty -p \{\} \;
并且没有
*
find $SOURCE1 -type d -empty -prune -exec rmdir --ignore-fail-on-non-empty -p \{\} \;
find $SOURCE2 -type d -empty -prune -exec rmdir --ignore-fail-on-non-empty -p \{\} \;
我可以添加 mkdir 测试并将 SOURCE1 更改为“/mnt/download/transmission/complete/test”,这样它总是会删除我刚刚创建的目录,但我想以正确的方式执行此操作
示例:我创建了 6 个目录:
test10/
test10/test11/
test10/test11/test12/
test10/test11/test12/test
test1/
test1/test2/
test1/test2/test3/
test1/test2/test3/test
运行 copy.sh 后,我最终在目标上完美复制了目录和文件(test1/test2/test3/test 和 test10/test11/test12/test),并删除了源上的目录和文件,包括源($SOURCE1 和 $SOURCE2)本身。
有没有办法告诉 find 排除源目录本身?换句话说:应删除以下目录下的所有内容,但不删除目录本身:
SOURCE1="/mnt/download/transmission/complete/"
SOURCE2="/mnt/download/sabnzbd/completed/"
答案1
如果您想使用find
,您应该添加标志-mindepth 1
,以便首先找到源目录下面的级别。
但是,您也可以使用一堆不同的工具,例如ls -d */
打印目录名称。
答案2
我找到了一种更优雅的方法;
SOURCE1="/mnt/download/transmission/complete/" # server1
SOURCE2="/mnt/download/sabnzbd/completed/" # server1
DESTINATION="/mnt/dune/DuneHDD_1234/Transfer" # server2
# move downloads to server2
sudo rsync --remove-source-files --progress --ignore-existing -vr $SOURCE1 $DESTINATION
sudo rsync --remove-source-files --progress --ignore-existing -vr $SOURCE2 $DESTINATION
# delete (only) empty directories left behind by rsync
find $SOURCE1 -mindepth 1 -type d -empty -delete # -mindepth:dont delete parent dir,-type d -empty -delete:delete only empty directories
find $SOURCE2 -mindepth 1 -type d -empty -delete
来源:删除空目录树(删除尽可能多的目录但不删除文件) 如果不允许,请告诉我