如何使用Applescript删除空文件夹?
我正在编写一个Applescript,它会提示用户选择一个文件夹,然后在该文件夹上运行脚本。脚本运行并基本上将文件排序到文件夹中。在脚本末尾,我希望删除空文件夹 在我想删除最后的空文件夹之前,脚本工作得非常出色 这是选择文件夹的原因:如何使用Applescript删除空文件夹?,applescript,Applescript,我正在编写一个Applescript,它会提示用户选择一个文件夹,然后在该文件夹上运行脚本。脚本运行并基本上将文件排序到文件夹中。在脚本末尾,我希望删除空文件夹 在我想删除最后的空文件夹之前,脚本工作得非常出色 这是选择文件夹的原因: tell application "Finder" set packageFolder to (choose folder with prompt "Please choose your logo package folder") as stri
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
,避免shell进一步解释-它基本上确保正确处理所选文件夹(其名称可能包括空格)的路径do shell script
-要搜索的文件的名称,即-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存储