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

如何使用Applescript删除空文件夹?,applescript,Applescript,我正在编写一个Applescript,它会提示用户选择一个文件夹,然后在该文件夹上运行脚本。脚本运行并基本上将文件排序到文件夹中。在脚本末尾,我希望删除空文件夹 在我想删除最后的空文件夹之前,脚本工作得非常出色 这是选择文件夹的原因: tell application "Finder" set packageFolder to (choose folder with prompt "Please choose your logo package folder") as stri

我正在编写一个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:Users:michael: 桌面:徽标包脚本测试:\“”编号 -1728来自“Macintosh HD:Users:michael:Desktop:Logo软件包脚本测试:”的每一类cfol»


我做错了什么?

这在最新版本的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

这在最新版本的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

这就是最终起作用的原因:

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
我在这里找到了这个解决方案:


再次感谢大家。很抱歉,这个问题措辞不准确。

这就是最终有效的方法:

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
我在这里找到了这个解决方案:

再次感谢大家。抱歉,问题措辞不准确。

隐藏的文件和文件夹怎么办?

提供的答案,在这个线程中,考虑任何只包含HIDEN1文件和/或隐藏文件夹的文件夹也是空的,导致它们被删除,<强>这可能导致丢失重要数据< /强>


更安全的解决方案: 使用以下解决方案,只有当空文件夹不包含文件和/或非空文件夹时(无论它们是可见的还是隐藏的),它才被视为空文件夹。但是,此规则的例外情况是任何只包含隐藏文件的文件夹-它们将被视为空的,因此也将被删除

此解决方案利用Bash命令并通过AppleScripts命令执行它

告诉应用程序“Finder”
设置packageFolder以选择文件夹,并提示“请选择您的徽标软件包文件夹”
将posixPath设置为packageFolder的POSIX路径的引号形式
执行shell脚本“find”&posixPath&“-name”.DS_Store'-type f-delete&&find”&posixPath&“-empty-type d-delete”
结束语
说明: 本质上,此AppleScript执行以下Bash命令:

find/path/to/directory/-name'.DS\u Store'-type f-delete
find/path/to/directory/-empty-type d-delete
让我们分解这两个命令的各个部分,以便更好地了解正在发生的事情:

第一个命令:

  • 查找
    -在文件夹层次结构中搜索满足给定条件的文件和文件夹名称

  • path/to/directory/
    -此(设计的)路径指向搜索应开始的目录。这将替换为实际路径,即通过命令选择并分配给
    packageFolder
    变量的文件夹路径

    我们通过以下部分向
    do shell脚本
    命令提供该路径(作为一个路径):

    set posixPath to quoted form of POSIX path of packageFolder
    
    该部分确保文件夹路径(即分配给
    posixPath
    变量的路径)提供给
    do shell script
    ,避免shell进一步解释-它基本上确保正确处理所选文件夹(其名称可能包括空格)的路径

  • -name
    -要搜索的文件的名称,即
    .DS\u Store

  • -键入f
    -此选项指定我们只希望包含常规的f文件

  • -删除
    -此选项删除符合先前指定标准的所有文件,即名为
    .DS\u Store的文件

第二个命令:

  • 查找
    -根据第一个命令
  • path/to/directory/
    -根据第一个命令

  • -empty
    -此选项指定仅当常规文件或目录为空时,才包含常规文件或目录

  • -键入d
    -此选项指定我们只希望包含d目录

  • -delete
    -按照第一个命令执行,但是这次我们只删除空文件夹


示例目录(之前和之后)。 给定如下所示的选定源目录树:

。
├── A.
│   ├── .隐藏目录a
│   │   └── foo.txt
│   └── .隐藏-dir-b
├── B
│   └── bb
│       ├── .德苏商店
│       └── bbb
├── C
│   └── .hidden.txt
└── D
├── dd
│   └── ddd
└── qux.txt
生成的目录树(即运行AppleScript后)将是:

。
├── A.
│   └── .隐藏目录a
│       └── foo.txt
├── C
│   └── .hidden.txt
└── D
└── qux.txt

重构: 当前的AppleScript(如上)假设您正在使用分配给脚本中其他位置的
packageFolder
变量的路径,因此它没有被更改。因此,它引入了以下行:

将posixPath设置为packageFolder的POSIX路径的引用形式
获取与所选文件夹路径等效的POSIX路径

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

告诉应用程序“Finder”
将packageFolder设置为的引号形式(POSIX路径为(选择文件夹并提示“请选择您的徽标软件包文件夹”))
执行shell脚本“查找”&packageFolder&“-name”.DS\u存储