需要一个bash脚本来自动化恼人的下载.DMG应用程序安装过程

时间:2011-09-04 18:42:13

标签: macos bash automation

我正在尝试自动执行.DMG文件附带的繁琐的应用程序安装过程。

我想要一个bash脚本:

  1. 将上次下载的.dmg文件挂载到~/Downloads目录。
  2. 将其中的.app文件复制到/ Applications目录。
  3. 卸载并删除.DMG文件。
  4. 我几乎是一个bash脚本菜鸟但我认为这个脚本的好处应该是显而易见的。我环顾谷歌并没有找到解决这个问题的方法,这是一种耻辱。让我们做一个。

    This answer提供了一个非常好的开始,但不够自动化。

2 个答案:

答案 0 :(得分:6)

你错过了什么?我认为只缺少一件事,就是查找应用程序并将其复制到/Application/目录。

MOUNTPOINT="/Volumes/MountPoint"
IFS="
"
hdiutil attach -mountpoint $MOUNTPOINT <filename.dmg>

for app in `find $MOUNTPOINT -type d -maxdepth 2 -name \*.app `; do
  cp -a "$app" /Applications/
done

hdiutil detach $MOUNTPOINT

当然,您需要将<filename.dmg>设置为dmg文件的目标。这可能是第一个论点或类似的东西。

答案 1 :(得分:2)

我刚刚创建了一个非常好的ruby脚本。

#!/usr/bin/env ruby

require 'fileutils'
require 'pathname'
include FileUtils

#go to downloads directory
puts "installing most recent .dmg"
cd File.expand_path("~/Downloads/")
path = Pathname.new('.')

#find most recent .dmg file
files = path.entries.collect { |file| path+file }.sort { |file1,file2| file1.ctime <=> file2.ctime }
files.reject! { |file| ((file.file? and file.to_s.include?(".dmg")) ? false : true) }
last_dmg = files.last

#if there is no .dmg file then reject this.
if !last_dmg
  puts "No DMG files" 
  exit
end

puts "Mounting #{last_dmg}"

mount_point = Pathname.new "/Volumes/#{last_dmg}"

result = `hdiutil attach -mountpoint #{mount_point}  #{last_dmg}`

#find any apps in the mounted dmg
files = mount_point.entries.collect { |file| mount_point+file }
files.reject! { |file| ((file.to_s.include?(".app")) ? false : true) }

files.each { |app| 
  puts "Copying #{app} to Applications folder"
  `cp -a #{app} /Applications/` 
}

#unmount the .dmg
puts "Unmounting #{last_dmg}"
result = `hdiutil detach #{mount_point}`
puts "Finished installing #{last_dmg}"


#delete the .dmg
rm last_dmg 

这是一个伟大的Alfred扩展http://cl.ly/391x0A0D0l2q0s0t3z2f