deepin优雅地使用坚果云攻略


1. 前言

坚果云是一款多平台同步软件,能够实时备份同步工作和学习中很多重要的脚本,配置等文件。

本篇主要介绍一些在deepin操作系统(最新版本deepin V20.2.3)上使用坚果云的经验,供有同样需求的朋友参考。

注:博客中涉及到的部分代码的修改在很久之前完成,因为能正常实现个人需求,就没有复核,能用就行。以后有兴致再优化。

2. deepin安装坚果云

deepin安装坚果云很简单,只需三步即可完成。

建议按照以下三个步骤安装,不要从商店安装坚果云

1.浏览器访问坚果云官方网站下载地址:https://www.jianguoyun.com/s/downloads,下载Linux版本的坚果云deb包

当前Linux版本的坚果云安装包最新版本5.1.2

2.deepin打开终端,执行:sudo apt install libnotify-dev安装相关依赖

3.找到下载的坚果云deb包,双击安装,输入密码,即可完成坚果云的安装

3. 配置坚果云的同步目录

3.1 重新配置默认放置目录

坚果云默认在当前用户的home目录下创建一个NutStore Files的目录用来放置同步的内容。

但是对于deepin文件管理器来说,在home目录下显示一个NutStore Files有些怪怪的。相比于坚果云,安装的微信就很老实,乖乖地躺在文档目录下。

所以对于如何修改坚果云的放置目录,放文件目录看起来尽然有续,归档自然?

答案是:在首次启动和登陆坚果云时配置同步目录。

意思就是:你要选择本地的哪个目录,来作为你存放在坚果云云端文件的目录。

所以先提前创建好一个目录:

  • 方式1,使用文件管理器,在“文档“下面创建”坚果云“
  • 方式2,使用终端,执行:mkdir ”~/Documents/NutStore Files“

上面两个方式均可,目的只是重新配置坚果云默放置的目录。目录到底是中文还是英文,就看个人喜好了。

然后点击登陆坚果云,在以下这个界面修改配置即可。

3.2 彻底解决在home下创建NutStore Files问题

上面的步骤能够修改坚果云默认的放置目录,但是不能够解决每次登陆坚果云以后,它在用户的home目录下创建NutStore Files目录的问题。

以下过程就是通过修改坚果云核心工作脚本,来彻底解决这个问题。

终端执行:vim ~/.nutstore/dist/bin/nutstore-pydaemon.py,修改内容如下:

第一处修改:

from indicator_menus import is_java_client_running, open_window
from resource_manage import PicturesManage
from log_utils import get_logger
from network_util import execute_cmd, Command

# 以下这几行是要添加的函数,函数的目的就是删除用户home目录下的NutStore Files目录
def remove_home_file():
    file = "/home/替换为你的帐号/Nutstore Files"
    if os.path.exists(file):
        shutil.rmtree(file)

def get_dist_dir():
    """Get the nutstore distribution install directory by the path to the python script"""
    path = os.path.dirname(sys.argv[0])
    abs_path = os.path.abspath(path)
    if os.path.basename(abs_path) != 'bin':

第二处修改:

class JavaAppWatchDog(threading.Thread):
    def __init__(self):
        remove_home_file()  #这里插入上面的函数
        # invoke the super class's constructor, if it has
        fun = getattr(threading.Thread, "__init__", lambda x: None)
        fun(self)
        self.daemon = True
        # It should only be set when the java app is restarted to migrate to another nutstore home
        self.__new_nutstore_home = None
        # It should only be set when the java app is restarted by adding more ignore path
        self.__ignore_path_list = None
        # How many times the java app has been restarted
        self.__restart_num = 0
        # It should only be set when the java app is restarted by switch account
        self.__switch_account = None
        # flag to indicate whether the watch dog thread should quit
        self.__exit = False
        # debug settings
        self.__cli_args = ' '.join(sys.argv[1:])
        self.__lock = threading.RLock()

    def set_new_nutstore_home(self, new_home_dir):
        remove_home_file() #这里插入上面的函数
        self.__lock.acquire()
        try:
            self.__new_nutstore_home = new_home_dir
        finally:
            self.__lock.release()

    def get_new_nutstore_home(self):
        remove_home_file() #这里插入上面的函数
        self.__lock.acquire()
        try:
            return self.__new_nutstore_home
        finally:

第三处修改:

def main_loop():
    watchDog = JavaAppWatchDog()
    watchDog.start()

    listen = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    listen.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    listen.bind(('localhost', LOCAL_PORT))

    while True:
        listen.listen(16)
        (conn, addr) = listen.accept()

        file = None
        try:
            # NS-4828 set mode='rw' cause python3 can't write without 'w'
            file = conn.makefile(mode='rw')
            remove_home_file() # 这里掺入上面的函数
            lines = []
            while True:
                line = file.readline().rstrip('\r\n')
                lines.append(line)
                if line == 'done' or line == '':
                    break

第四处修改:

if __name__ == '__main__':
    signal.signal(signal.SIGINT, sigint_handler)
    if is_java_client_running():
        remove_home_file() #这里插入上面的函数
        has_file_by_lightapp, path = parse_file_to_open_in_lightapp()
        if has_file_by_lightapp:
            if path: open_file_in_lightapp(path)
            else: open_wizard_in_lightapp()
        else:
        open_window()

上面修改完成后,保存退出即可。

再也不会应为启动坚果云,home目录下出现NutStore Fiels目录了,它会被自动删除。

4. 剪裁坚果云

4.1 卸载坚果云轻应用

坚果云的安装,会附带安装一些轻应用,使用时,一些默认格式的文件会从轻应用打开。

如果不喜欢使用坚果云轻应用,可以在deepin启动器,找到“坚果云轻应用”快捷方式,右键卸载即可

4.2 目录瘦身

虽然能够卸载轻应用,但是实际上轻应用的可执行文件等,还是存在本地的。

一个快捷的验证就是:

终端执行:du -sh ~/.nutstore/,会发现该目录很大。而造成这么大的原因,就是~/.nutstore/apps这个目录

如果只是单纯删除这个目录,坚果云会自动修复(即自动下载生成这个目录),保证其功能的可用性。

为了解决这个问题,就需要修改坚果云的核心工作脚本了:~/.nutstore/dist/bin/nutstore-pydaemon.py

解决方案,vim 编辑~/.nutstore/dist/bin/nutstore-pydaemon.py,修改内容如下,保存退出即可。

if __name__ == '__main__':
    signal.signal(signal.SIGINT, sigint_handler)
    if is_java_client_running():
        remove_home_file()
        #has_file_by_lightapp, path = parse_file_to_open_in_lightapp()
        #if has_file_by_lightapp:
            #if path: open_file_in_lightapp(path)
            #else: open_wizard_in_lightapp()
        #else:
        open_window() #注意要调整这一行的缩进,保持与remove_home_file()同级缩进
    ....#其他代码

然后就可以痛快地删除~/.nutstore/apps/lightapp/1.0.1/下的内容了。
千万注意:需要保留1.0.1的版本目录,否则会自动创建

5. 修复安装坚果云后产生的问题

场景1:安装了坚果云以后,创建的Markdown文件,即以.md为文件格式显示为白色,mime图标丢失

解决方式:

终端执行:rm -rf ~/.local/share/mime。即删除该目录即可