在硬盘驱动器上的任意位置找到文件并将其传输到其他文件夹

时间:2017-08-18 04:55:37

标签: applescript

我正在尝试创建一个应用程序,以将具有特定名称的任何文件传输到另一个文件夹。到目前为止,我有以下内容:

tell application "Finder"
move (every item of (get path to home folder) whose name is "extended image name.jpg") to ((get path to home folder) & "Pictures" as string)
end tell

虽然这不会返回任何错误,但它不能完成我想要的任何错误。我也知道这只搜索主文件夹,所以如果有任何方法可以更广泛地搜索整个驱动​​器而无需输入用户名,那就太棒了(我希望这能够在更多的计算机上运行)没有他们必须编辑脚本的人。)

-Thanks

2 个答案:

答案 0 :(得分:1)

代码只考虑主文件夹中的文件而不考虑其子文件夹中的文件,以考虑必须添加的所有子文件夹entire contents

tell application "Finder"
    move (every item of entire contents of home whose name is "extended image name.jpg") to folder "Pictures" of home
end tell

但要注意entire contents非常慢。 shell命令find或使用mdfind的聚光灯搜索要快得多,例如

set homeFolder to POSIX path of (path to home folder)
set picturesFolder to POSIX path of (path to pictures folder)
do shell script "mdfind -onlyin " & quoted form of homeFolder & " -0 'kMDItemDisplayName = \"extended image name.jpg\"' | xargs -0 -J {} mv {} " & quoted form of picturesFolder

重要提示

当您移动多个具有相同名称的文件时,Finder版本将要求覆盖,而shell版本将覆盖所有具有相同名称的文件。

答案 1 :(得分:0)

当您使用Finder进行搜索时,如果您的文件夹只包含几百个文件就可以了。但是如果你想在包含数千个文件的文件夹中搜索,Finder将花费太长时间。在这种情况下,最好使用shell命令'find',这要快得多。

find命令的语法是:find directory / -name target_file_name

更重要的是,您可以使用-exec fonction链接该命令,该函数将使用find的结果执行某些操作:在您的情况下复制在Pictures文件夹中找到的文件。

在-exec命令中,{}表示找到的文件。 shell copy命令是cp。

结束于:find / Users / myUserName / -name'extended image name.jpg'-exec cp {} \;

(注意:\;告诉系统这是-exec命令的结尾)

总的来说,您可以通过do shell脚本在Applescript中运行此命令:

set Source to POSIX path of (path to home folder)
set Dest to POSIX path of (path to pictures folder)
set TargetName to "extended image name.jpg"
set BackSlash to ASCII character 92
set SemiCol to ASCII character 59

try
    do shell script "find " & Source & " -name " & quoted form of TargetName & " -exec cp {} " & Dest & " " & BackSlash & SemiCol
end try

它比Finder语法长得多,但运行速度也快得多!

注意:

1)POSIX路径将Finder路径转换为:使用/

转换为shell路径

2)反斜杠和SemiCol设置为\和; 。这是一个解决方法,以避免Applescript编译器在编译期间误解了\

3)do shell脚本在try / end try块中以避免错误。当您尝试未经许可访问文件时,“查找”会出错。这些错误将被忽略。

4)使用此方法,您可以用“/”替换Source。这样,find将搜索主驱动器的所有目录(可能需要一些时间!)。如果要搜索所有用户,请将Source设置为“/ Users /”