【问题标题】:Find and open a folder by its substring通过子字符串查找并打开文件夹
【发布时间】:2019-09-12 05:10:40
【问题描述】:

我有以下需求,不知道怎么解决:

  • 给出的是一个类似“PA01021234”的字符串(带有显示对话框和用户输入)
  • 在挂载的网络卷上有一个名为“PA01021234_xyz”的文件夹
  • 我希望我的 Applescript 通过其子字符串找到该文件夹​​并打开它

我想我需要一个包含我的卷上所有文件夹的数组,以及一个将文件夹名称与我的子字符串进行比较的循环。但我不知道如何实现这一点,因为我对 Applescript 不是很熟悉。

而且我不知道是否可以使用纯 Applescript 或者我是否需要一些 shell 脚本。

任何帮助表示赞赏!


编辑:

附加要求如下:

  1. 要查找的文件夹将始终位于已挂载的网络卷的第一级。
  2. 子字符串(例如 PA01021234)将始终位于文件夹名称的开头。
  3. 总是只有一种可能的匹配。

【问题讨论】:

    标签: shell terminal applescript


    【解决方案1】:

    在 applescript 中,您可以使用系统事件来获取此信息,如下所示:

    set folderPath to findFolder("PA01021234", "Volume Name")
    
    on findFolder(folderPrefix, diskName)
        tell application "System Events"
            set folderList to POSIX path of folders of disk diskName whose name begins with folderPrefix
        end tell
    
        if folderList is {} then
            return missing value
        else
            set theFolder to first item of folderList
            tell application "System Events"
                open folder theFolder
            end tell
            return theFolder
        end if
    end findFolder
    

    这将打开相关文件夹并返回并返回其 POSIX 路径,如果未找到则返回“缺失值”。

    【讨论】:

    • 感谢@Ted Wrigley!这正是我正在寻找的东西,就像一个魅力:)
    • 我有一个额外的想法……所以如果在我的第一卷上找不到我的文件夹,它应该在另一个卷上搜索该文件夹。但这次文件夹不在卷的第一级。实际上它可以在任何级别,因此必须在整个卷中搜索该文件夹。 @Ted Wrigley 你也可以帮我解决这个想法吗?
    • 这是一个更复杂的脚本。我们可以使用普通的 AppleScript 搜索驱动器,但它通常速度慢得令人望而却步。大多数人要么使用do shell script 命令并调用findmdfind(如果卷被索引),要么切换到AppleScriptObjC。你应该先搜索一下,因为前两个我在 google 上看过很多次,但如果找不到,请提出一个新问题。
    【解决方案2】:

    试试这个 Shell 脚本:

    #!/bin/bash
    [ "$#" -lt 1 ] && exit 1
    
    for mnt_pnt in $(df -t nfs | grep -v 'Filesystem' | awk '{print $NF}')
    do
            find ${mnt_pnt} -name "$1" -type d -print | xargs nautilus
    done
    

    您必须像bash find_mntdir.sh PA01021234 一样以bash <above_script.sh> <input> 的身份执行。

    【讨论】:

    • grep awk,嗯? grep -Eo '/(\w|/)*$' OR awk '/\//{ print $NF }' 产生相同的结果。 nfs 不会产生所有网络卷。您可以使用lsvfs 了解可访问卷的分类方式。由于 OP 声明该文件夹始终是顶级目录,因此 for 循环和 find 不如简单的 printf '%s\n' /Volumes/*/*/ | grep -i "/Volumes/.*$1.*"
    • 感谢您采用这种方法,但我更喜欢像 @Ted Wrigley 这样发布的纯 Applescript 解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-15
    • 1970-01-01
    • 1970-01-01
    • 2016-06-28
    • 1970-01-01
    • 2016-09-09
    相关资源
    最近更新 更多