Applescript:计算子文件夹中 JPG 文件的数量

Applescript: Counting the number of JPG files in subfolders

更新: 这是当前代码,returns 0,即使选择 jpg 图像文件夹

set f to (choose folder)
set posixF to POSIX path of f
set result to do shell script "find " & posixF & " -iname \"*.JPG\" | wc -l"

display dialog result

我需要一种方法来计算不同文件夹集合中的所有 JPG 文件。这些文件夹的组织方式如下:最外层文件夹 -> 对象文件夹 -> 扫描件(包含 JPG 文件)或原件(包含 TIFF 文件)。外部文件夹最多可以有数百个对象文件夹,因此需要一个脚本来计算文件。

我四处寻找 applescript 解决方案,我找到的最接近的解决方案只计算单个文件夹中的 JPG 数量,而不是其子文件夹中的 JPG 数量。如果我将最外层的文件夹放到应用程序上,我会得到 0 的输出,但是如果我放下其中一个内部 Scans 文件夹,我会得到 10(该测试文件夹中 JPG 文件的实际数量)

这是我目前的情况:

global currentCount
on open droppings
set NoOfFiles to 0
repeat with everyDrop in droppings
    if (info for everyDrop)'s folder is true then
        tell application "Finder"
            set currentCount to (count of (files in folder everyDrop whose name extension is "jpg")) as integer
            set NoOfFiles to NoOfFiles + currentCount
        end tell
        display dialog NoOfFiles
    end if
end repeat
end open

on run
display dialog "Drop some folders onto the application to count the number of JPG files" buttons {"OK"} default button "OK"
end run

我也尝试过将其中一些代码添加到自动程序中,并选中 "Get Folder Contents" 和 "Repeat for each Subfolder found" 选项,但我收到错误消息说 applescript "couldn't make alias... something.tif into type folder".

借助 post 上的代码找到了答案:http://macscripter.net/viewtopic.php?id=11362

这是最终代码:

set the_folder to choose folder with prompt "Please select directory." --(path to desktop) as string
set file_types to {"JPEG"} --file types, set to {} and inc_folders to true to just return folders
set with_subfolders to true --list subfolders or not (recursion)
set inc_folders to false --include folders in the list of files to return
set the_files to get_folder_list(the_folder, file_types, with_subfolders, inc_folders)
set item_count to (get count of items in the_files)
display dialog "There are " & item_count & " JPG files in this folder."
return the_files

on get_folder_list(the_folder, file_types, with_subfolders, inc_folders)
set the_files to {}
tell application "Finder" to set folder_list to every item of folder the_folder
repeat with new_file in folder_list
    try
        set temp_file_type to file type of new_file
    on error
        set temp_file_type to "fold"
    end try
    if file_types contains temp_file_type or file_types = {} then set the_files to the_files & {new_file as string}
    if temp_file_type = "fold" then
        if inc_folders = true and file_types ≠ {} then set the_files to the_files & {new_file as string}
        if with_subfolders = true then set the_files to the_files & my get_folder_list((new_file as string), file_types, with_subfolders, inc_folders)
    end if
end repeat
return the_files
end get_folder_list

又更新了一次 :-)

这似乎有效...

set f to (choose folder)
set posixF to POSIX path of f
display dialog posixF
say posixF
set cnt to do shell script "find " & quoted form of posixF & " -type f | wc -l"
say cnt
display dialog cnt

我只是用say调试。

更新答案

您可以将 shell 脚本的结果放入 Applescript 变量中,如下所示:

set result to do shell script "find . -iname \"*.JPG\" | wc -l"
say result

您可以像这样将 Applescript 变量传递给 shell 脚本:

set var to "/tmp/*"
set result to do shell script "find " & var & " | wc -l"
say result

您可以允许用户选择文件夹:

set f to (choose folder)
set posixF to POSIX path of f
say posixF

原答案

您可以使用 shellfind 命令为您完成此操作。启动终端并键入此命令以查找主目录中所有 JPEG 文件的名称:

find $HOME -iname "*.jpg" -print

也就是说... 从 $HOME 开始,找到名称以 JPG(或任何小写变体)结尾的所有文件并打印它们的名称

-iname 表示 不区分大小写的名称,而 -name 则要求大小写完全匹配。

现在,如果您还想要 /usr 中的 JPEG 文件 ,只需像这样添加:

find /usr $HOME -iname "*.jpg" -print

如果你想让它计数文件,让wc(字数统计程序)像这样计算输出的行数:

find /usr $HOME -iname "*.jpg" -print | wc -l

因此,您可以将其包装在 Applescript 中的 do shell script 中并获得答案。如果有您无法访问的文件,您可能会遇到错误,因此您可以将它们丢弃到 bit-bucket 中,如下所示:

find /usr $HOME -iname "*.jpg" -print 2> /dev/null | wc -l

您还可以添加 -type f 以仅计算 文件,这样它就不会计算名为 ImagesInJPG 的目录(如果您有这样的目录) Mac.

上的野兽

请注意,您可以将 "*.jpg" 替换为 \*.jpg,如果这样可以使您的 Applescripting 更容易。