Dolphin右键菜单服务脚本:解决重复复制文件夹嵌套重复及rsync兼容问题
Dolphin右键菜单服务脚本:解决重复复制文件夹嵌套重复及rsync兼容问题
嘿,我来帮你搞定这个Dolphin右键菜单的同步问题!你想要的核心需求很明确:把选中的文件/文件夹同步到~/Dropbox/.Home目录,自动去掉本地/home/你的用户名路径前缀,同时避免重复操作时出现文件夹嵌套的尴尬情况对吧?
先说说你之前遇到的问题:
- 用
cp -pur的方式,第一次复制完全正常,但第二次再同步同一个文件夹时,cp会把源文件夹整个放到已存在的目标文件夹里,导致出现~/Dropbox/.Home/.local/share/applications/applications这种嵌套结构——这是因为当目标路径已存在时,cp默认会把源对象放到目标目录下,而不是覆盖更新内容。 - 改用
rsync时你加了"$file"/的后缀,虽然能解决文件夹的嵌套问题,但这个写法对文件无效,因为文件后面加斜杠是不符合rsync语法的,自然会出错。
那怎么解决呢?我们只需要给脚本加一个简单的判断:区分当前处理的是文件还是文件夹,然后给rsync用对应的参数就好了。下面是修正后的完整脚本,你可以直接放到你的.desktop服务菜单文件里:
[Desktop Entry] Type=Service ServiceTypes=KonqPopupMenu/Plugin MimeType=all/all; Name=Sync to Dropbox .Home Exec=for file in %f; do \ new_path=$(echo "$file" | sed "s|^/home/$(whoami)||"); \ dest=~/Dropbox/.Home"$new_path"; \ mkdir -p "$(dirname "$dest")"; \ if [ -d "$file" ]; then \ rsync -rptog --update "$file"/ "$dest"; \ else \ rsync -ptog --update "$file" "$dest"; \ fi \ done
我来拆解下这个脚本的关键逻辑:
- 路径处理:还是用你原来的
sed命令去掉/home/你的用户名前缀,得到相对目标路径new_path。 - 目标目录准备:用
mkdir -p确保目标路径的父目录都存在,避免报错。 - 文件/文件夹判断:
- 如果当前处理的是文件夹,就用
rsync -rptog --update "$file"/ "$dest":这里的/表示只同步文件夹里的内容到目标路径,不会把源文件夹本身放进去;--update参数会只更新目标中比源文件旧的内容,节省时间;-rptog则保留了权限、时间戳、所有者/组等属性,和你原来cp -pur的效果一致。 - 如果是文件,就去掉
-r(递归参数)和源路径后的/,直接同步文件到目标位置。
- 如果当前处理的是文件夹,就用
如果你需要删除目标中已不存在于源的文件,可以在rsync参数里加上--delete;如果不需要这个功能,保持现有参数就好。
这样修改后,不管你是第一次同步还是后续更新,都不会出现文件夹嵌套的问题:同步文件夹时会直接更新目标里的内容,同步文件时也能正常覆盖或更新,完美匹配你的需求!
备注:内容来源于stack exchange,提问作者mioufts
相关产品推荐
相关产品推荐

