我正在编写一个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»
我在这里做什么错了?
答案 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)
在此线程中here和here提供了答案,请考虑仅包含 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 重复。
-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