Airdrop File Transfer

Posted by Learning libs on December 27, 2020

修改 AirDrop 文件存放位置https://sspai.com/post/59682

Folder Actions 是 macOS 的一项功能,可让你将 AppleScript 脚本与文件夹进行关联。当关联的文件夹有添加或删除的项目,或者其窗口打开,关闭,移动或调整大小时,将执行“文件夹操作”脚本。详情可以点击这里查看官方文档。

思路

按照文档的说法,只要我写好一个 AppleScript 脚本并与下载文件夹关联,那么当 Mac 接收到 AirDrop 来的文件时,就自动移动该文件到我期望的文件夹下。看起来似乎可行。

不过,要想移动 AirDrop 来的文件,就必须知道该文件是通过 AirDrop 方式来的,那么如何识别出下载文件夹下新增的文件是 AirDrop 来的呢?

👉文件属性

macOS 下有「文件属性」这一概念,如果你经常使用命令行,那么你对 ls 指令一定不陌生。在日常 ls -la 时,可能会遇到某些文件的权限列表后面还会有 @ 符号,它就代表该文件有扩展属性。

ls -la 抑或是你从互联网上下载了某一应用,当你第一次打开该应用时系统会提示「您确定要打开它吗?”如果您对文件的安全性有疑问,应点按“取消”」。这也是利用「文件属性」这一特性来实现的。

那么我只要利用这一特性,来判断文件是否来源于 AirDrop 即可筛选出所需移动的文件。

经查 AirDrop 对应 com.apple.quarantine 属性的值为 59 。

实现

创建 AppleScript 脚本

首先,确保 /Users/username/Library/Scripts/ 路径下是否有 Folder Action Scripts 文件夹 —— 用来存放所需的脚本。没有则创建。

然后在该目录下(/Users/username/Library/Scripts/Folder Action Scripts)创建 AppleScript 脚本,形如:AirDrop.scpt ,文件名取一个你喜欢的即可。脚本内容为:


property AIRDROP_FOLDER : "Macintosh HD:Users:username:Downloads:AirDrop" # 期望的路径,用 : 分割
property QUARANTINE_KEY : "59"

property GET_QUARANTINE_COMMAND_START : "ls -l -@ '"
property GET_QUARANTINE_COMMAND_END : "' | tr '\\n' ' ' | sed 's/.*com\\.apple\\.quarantine\\s*\\(\\d*\\)/ \\1/' | awk '{$1=$1};1'"

on adding folder items to this_folder after receiving added_items
    repeat with i from 1 to length of added_items
        set current_item to item i of added_items
        set quarantine_type to getQuarantineType(POSIX path of current_item)
        if quarantine_type is equal to QUARANTINE_KEY then
            moveFile(current_item, alias AIRDROP_FOLDER)
        end if
    end repeat
end adding folder items to

on moveFile(move_file, destination_dir)
    tell application "Finder"
        move move_file to destination_dir with replacing
    end tell
end moveFile

on getQuarantineType(file_path)
    return do shell script GET_QUARANTINE_COMMAND_START & file_path & GET_QUARANTINE_COMMAND_END
end getQuarantineType

脚本内 AIRDROP_FOLDER 需要修改为自己期望的路径,注意路径分割符需用 : 而不是常见的 /。

脚本逻辑为:当新增文件的文件属性 com.apple.quarantine 值为 59 时,就将该文件移动到 AIRDROP_FOLDER 设置的路径内。

配置

右键下载文件夹,服务,打开 Folder Actions 设置(或者通过terminal搜索Folder Actions Setup)。

点击「运行服务」

在左边的配置窗口里添加下载文件夹,在右边的配置窗口里添加我们刚刚编写的 AirDrop.scpt 脚本。

自此,大功告成。当你再 AirDrop 到电脑上文件时,一旦文件接收完毕,系统就会自动将该文件移动到你设置的目录里啦。