AppleScript:字符串和文件操作

0 投票
3 回答
519 浏览
提问于 2025-04-17 09:52

我用一个叫做 mdfind() 的脚本收集了一些文件的列表,现在我需要把找到的每个文件都复制一份,并且记录下它们原来的路径,以备后用。简单来说,我得把大量分散的旧 AppleWorks 文件移动到一个新地方,手动更新它们,然后把原来的文件替换成新的、更新过的版本,而且要放在同样的位置,文件名也要一样(不过文件扩展名和文档类型可以不同)。

因为我对 AppleScript 还不太熟悉,所以我用 Python 来处理文件,只用 AppleScript 来找到这些文档(因为仅仅依靠文件扩展名不够,我需要通过 mdfind 来查看苹果的元数据标签)。

但是我用 AppleScript 生成的文档——一个文件路径的列表——使用的是苹果的 "\r" 换行符,所以我没法轻松地把它导入到 Python 中。

我的 AppleScript 是:

set the_script to "mdfind   kMDItemKind=='*AppleWorks*'"
set the_text to (do shell script the_script)
set the_doc to (choose file)
write the_text to the_doc

这个脚本生成了一个 .txt 文件,里面有各种漂亮的路径名,但 Python 把它当成了一个巨大的字符串来读取。

我该怎么做才能:

a) 告诉 AppleScript 在每一行后面加一个自定义的换行符(比如 "\n")

或者

b) 告诉 AppleScript 把找到的每个文件复制到一个新位置,同时保留原来的文件,并记录下它们的路径?

任何帮助都非常感谢。

更新 @Kindall

这是我尝试用 mdfind 命令时,Python 抛出的错误:

 File "<stdin>", line 1, in <module>
 File     "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 679, in __init__
errread, errwrite)
 File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 1228, in _execute_child
raise child_exception
OSError: [Errno 2] No such file or directory

有什么想法吗?我主要是做网页开发的,现在试着学一些其他语言,以避免手动整理我老板那台老旧 Mac 笔记本上的 2000 到 3000 个文件,哈哈(我已经修正了你原始代码中的排版错误,我并不是想逐字运行它)。

3 个回答

2

那(d)怎么样呢:在Python中使用mdfind

import subprocess

command = "mdfind kMDItemKind=='*AppleWorks*'"
subpipe = subprocess.Popen(command, stdout=subprocess.PIPE)
outlist = subpipe.communicate()[0].splitlines()

for filename in outlist:
    print filename    # or whatever

注意:我现在其实不是在用Mac,但我在Windows上用dir C:\这个命令时效果不错,所以在Mac上用mdfind应该也没问题。

2

你觉得这样怎么样:在用Python读取文件后,按照'\r'来分割文件的内容?

0

根据Kindall的建议,我和实验室的一些同事一起做了一个解决方案,这个方案完全使用Python,并且在苹果电脑上运行得很好,具体代码如下:

import os
import subprocess

outfile = os.open("test",os.O_CREAT)
os.close(outfile)
outfile = os.open("test",os.O_RDWR)
command = ["mdfind","kMDItemKind == '*AppleWorks*'"]
subpipe = subprocess.Popen(command, stdout=outfile)

这个代码会在运行脚本的文件夹里生成一个文本文件。感谢大家的各种建议。

撰写回答