如何使用Applescript删除空文件夹?

时间:2018-08-09 18:49:10

标签: applescript

我正在编写一个Applescript,提示用户选择一个文件夹,然后它将在其上运行脚本。该脚本运行,并且基本上将文件分类到文件夹中。在脚本末尾,我希望删除空文件夹。

该脚本运行良好,直到我要删除最后的空文件夹为止。

这是选择文件夹的地方:

tell application "Finder"
    set packageFolder to (choose folder with prompt "Please choose your 
    logo package folder") as string
end tell

这是删除空文件夹的代码:

tell application "Finder"
    repeat with oneFolder in (get folders of packageFolder)
        if (count items) of oneFolder is 0 then delete oneFolder
    end repeat
end tell

我收到以下错误:

结果:

  

错误“无法获得|的每个文件夹”,Macintosh HD:用户:michael:   桌面:徽标包脚本测试:“”。   -1728,来自“ Macintosh HD:用户:michael:台式机:徽标包脚本测试:”的每个类cfol»

我在这里做什么错了?

3 个答案:

答案 0 :(得分:0)

这对我适用于最新版本的macOS High Sierra

set packageFolder to (choose folder with prompt "Please choose your 
    logo package folder") as string

tell application "Finder"
    set theFolders to folders of entire contents of folder packageFolder
    repeat with i from 1 to count of theFolders
        set thisFolder to item i of theFolders
        if (count of items of thisFolder) is equal to 0 then
            delete thisFolder
        end if
    end repeat
end tell

答案 1 :(得分:0)

这就是最终的结果:

on killEmpty(fol)

    tell application "Finder"

        repeat with f in (get fol's folders)

            my killEmpty(f)

        end repeat

        if (count items of fol) is 0 then delete fol

    end tell

    end killEmpty



    tell application "Finder"

    repeat with f in (get folders of folder packageFolder)

        my killEmpty(f)

    end repeat

end tell

我在这里找到了这个解决方案: https://discussions.apple.com/message/20188767#message20188767

再次感谢大家。抱歉,措词不正确。

答案 2 :(得分:0)

隐藏文件和文件夹呢?

在此线程中herehere提供了答案,请考虑仅包含 hidden 1 文件和/或的任何文件夹隐藏的文件夹也为空-导致它们被删除, 可能会导致重要数据丢失


更安全的解决方案:

使用以下解决方案,只有在包含文件和/或非空的情况下,空文件夹才被视为 文件夹-可见还是隐藏。但是,此规则的例外是任何仅包含隐藏的.DS_Store文件的文件夹-它们将被视为空文件,因此也将被删除。

此解决方案利用Bash find命令并通过AppleScripts do shell script命令执行它。

tell application "Finder"
  set packageFolder to choose folder with prompt "Please choose your logo package folder"
  set posixPath to quoted form of POSIX path of packageFolder
  do shell script "find " & posixPath & " -name '.DS_Store' -type f -delete && find " & posixPath & " -empty -type d -delete"
end tell

说明:

本质上,此AppleScript执行以下Bash命令:

find /path/to/directory/ -name '.DS_Store' -type f -delete
find /path/to/directory/ -empty -type d -delete

让我们细分这两个命令的部分,以更好地了解正在发生的事情:

第一个命令:

  • find -在文件夹层次结构中搜索符合给定条件的文件和文件夹名称。

  • path/to/directory/ -此(人为)路径指向搜索应从其开始的目录。该路径将替换为实际路径,即选择到哪个文件夹的路径,并通过choose folder命令将其分配给packageFolder变量。

    我们通过以下内容将路径(作为POSIX path)提供给do shell script命令:

       
    set posixPath to quoted form of POSIX path of packageFolder
    

    quoted form部分确保将文件夹路径(即分配给posixPath的文件夹路径)提供给do shell script,避免了shell的进一步解释-它实质上确保了路径正确选择了名称可能包含空格的所选文件夹中的文件。

  • -name -要搜索的文件名,即.DS_Store

  • -type f -此选项指定我们仅 要包含常规的 f ile。

  • -delete -此选项将删除所有符合先前指定条件的文件,即名为.DS_Store的文件。

第二个命令:

  • find -按照第一个命令。
  • path/to/directory/ -按照第一个命令。

  • -empty -此选项指定我们要包含常规文件或仅 目录(如果为空)。

  • -type d -此选项指定我们要包含 d 重复。

    < / li>
  • -delete -按照第一个命令。。但是,这次我们仅 删除空文件夹。< / p>


示例目录(之前和之后)。

给出如下所示的选定源目录树:

.
├── a
│   ├── .hidden-dir-a
│   │   └── foo.txt
│   └── .hidden-dir-b
├── b
│   └── bb
│       ├── .DS_Store
│       └── bbb
├── c
│   └── .hidden.txt
└── d
    ├── dd
    │   └── ddd
    └── quux.txt

生成的目录树(即在运行AppleScript之后)将是:

.
├── a
│   └── .hidden-dir-a
│       └── foo.txt
├── c
│   └── .hidden.txt
└── d
    └── quux.txt

重构:

当前的AppleScript(以上)假定您使用的是脚本中其他位置分配给packageFolder变量的路径,因此未更改。因此,它引入了读取的行;

set posixPath to quoted form of POSIX path of packageFolder    

获得与所选文件夹路径等效的POSIX路径。

但是,如果没有在其他地方使用packageFolder变量,则可以将脚本重构为以下内容:

tell application "Finder"
  set packageFolder to quoted form of (POSIX path of (choose folder with prompt "Please choose your logo package folder"))
  do shell script "find " & packageFolder & " -name '.DS_Store' -type f -delete && find " & packageFolder & " -empty -type d -delete"
end tell

1 MacOS上隐藏的文件和文件夹是名称以点(.)开头的文件和文件夹。例如.gitignore