Apple's OS X has an easy way to rip a CD/DVD image using Disk Utility program.
However, you'll end up with a file in that is not in ISO format, thus utterly useless if you want to re-use the file for virtualization purposes or on another operating system unable to handle those .cdr files.
For a one-shot option, OS X provides everything to convert the .cdr to .iso files, which is outlined at http://imacify.com/2013/06/how-to-create-iso-disc-image-from-cddvd-in-mac-os-x/.
If you do however plan to rip a lot (and I mean, a lot!) of CDs/DVDs to ISO files on OS X, here's a little bash script I came up with.
This script essentially does the following:
- It waits for a disc to be inserted
- It scans the disk label and writes an ISO file to your ~/Desktop/rips directory using the dd command
- go back to 1 ;-)
So essentially, it's made to do mass ripping. I needed it for myself as I finally wanted to rip my gazillion of physical data CDs/DVDs onto my file server. And since I'm a lazy guy, the script shall do as much as possible by itself without bugging me too much ;-)
So if you think, that could be of use to you as well, here's a one-liner so you can call it up directly into your shell:
wget -qO- http://phunsites.net/scripts/ripiso.sh.gz | gunzip | bash
Calling the script like this, will assume non-interactive mode, i.e. the script will run endlessly and no questions will be asked.
Press CTRL-C to terminate the script.
You could also run it interactively, the script will then ask some Y/N questions. To do so, download the script and run ith with the -i (interactive) argument like this:
wget -qO- http://phunsites.net/scripts/ripiso.sh.gz | gunzip > ripiso.sh
./ripiso -i
Here's also a direct download link: http://phunsites.net/scripts/ripiso.sh.gz, in case you want to inspect the script first.
The script tries to be somewhat informative, here's an example output of the non-interactive mode:
$ wget -qO- http://phunsites.net/scripts/ripiso.sh.gz | gunzip | bash
Waiting for CD/DVD to be inserted ...
Waiting for CD/DVD to be inserted ...
Waiting for CD/DVD to be inserted ...
Waiting for CD/DVD to be inserted ...
Waiting for CD/DVD to be inserted ...
Found CD/DVD disk=/dev/disk1, volume=SOL_10_305_SPARC on /Volumes/SOL_10_305_SPARC from /dev/disk1s0
Unmounting disk from /Volumes/SOL_10_305_SPARC ...
Volume SOL_10_305_SPARC on disk1s0 unmounted
Ripping CD/DVD to /Users/Gianpaolo/Desktop/rips/SOL_10_305_SPARC.iso ...
0+0 records in
0+0 records out
0 bytes transferred in 0.043732 secs (0 bytes/sec)
14364+0 records in
14364+0 records out
7354368 bytes transferred in 5.015581 secs (1466304 bytes/sec)
33065+0 records in
33065+0 records out
[ ... some output omitted ... ]
1567823+0 records in
1567823+0 records out
802725376 bytes transferred in 420.424699 secs (1909320 bytes/sec)
Ejecting CD/DVD ...
Disk /dev/disk1 ejected
CD/DVD rip completed after 425 seconds.
Waiting for CD/DVD to be inserted ...
Waiting for CD/DVD to be inserted ...
Waiting for CD/DVD to be inserted ...
Waiting for CD/DVD to be inserted ...
And here's also the source code of it for your convenience:
#!/bin/bash
#
# ripiso.sh
# a helper script to easily rip inserted DVD/CD to an ISO file
#
# Copyright (c) 2014 Gianpaolo Del Matto, http://phunsites.net. All rights reserved.
# Redistribution and use in source and binary forms, with or without modification,
# are permitted provided that the following conditions are met:
#
# 1) Redistributions of source code must retain the above copyright notice,
# this list of conditions and the following disclaimer.
#
# 2) Redistributions in binary form must reproduce the above copyright notice,
# this list of conditions and the following disclaimer in the documentation
# and/or other materials provided with the distribution.
#
# history:
#
# r0.1 2014/08/03 Gianpaolo Del Matto, http://phunsites.net
#
#
# info:
#
# most current version is always available through:
#
# wget -qO- http://phunsites.net/scripts/ripiso.sh.gz | gunzip | bash
#
# local vars
#
force_non_interactive=1
# sanity checks: create the output directory if missing
#
[ ! -d "~/Desktop/rips/" ] && mkdir -p "~/Desktop/rips/"
# parse cli args
#
[ ! -z "$1" -a "$1" = "-i" ] && force_non_interactive=0
# rip_iso will try to rip an ISO from any currently
# inserted / mounted CD/DVD
#
function rip_iso {
start=`date +%s`
# get disk info from inserted disk, bail out if none found
#
mountinfo=`mount | grep cd9660`
[ "$?" != "0" ] && { echo "error: no CD/DVD found"; return 1; }
devid=`echo ${mountinfo} | awk '{ print $1 }'`
mountpoint=`echo ${mountinfo} | awk '{ print $3 }'`
label=`basename ${mountpoint}`
blockdev=`echo ${devid} | sed 's/s[0-9]$//g'`
printf "Found CD/DVD disk=%s, volume=%s on %s from %snn" ${blockdev} ${label} ${mountpoint} ${devid}
while [ : ]; do
# skip this if we're running non-interactive
# assume the user wants it be done :-)
#
[ "${force_non_interactive}" = "1" ] && break
printf "Continue? [Y|n] "
read _answer < /dev/tty
echo ${_answer} | grep -E -i -e '^y$' > /dev/null 2>&1
[ "$?" = "0" ] && break || return 1
done
printf "Unmounting disk from %s ...n" ${mountpoint}
diskutil unmount ${mountpoint}
printf "Ripping CD/DVD to %s ...n" ~/Desktop/rips/${label}.iso
dd if=$blockdev of=~/Desktop/rips/${label}.iso &
while [ : ]; do
clear
killall -SIGINFO dd > /dev/null 2>&1
[ "$?" != "0" ] && break
sleep 5
done
printf "Ejecting CD/DVD ...n"
diskutil eject ${blockdev}
end=`date +%s`
time_elapsed=`expr ${end} - ${start}`
printf "CD/DVD rip completed after %s seconds.n" ${time_elapsed}
return 0
}
# main
# ##########
while [ : ]; do
# detect if mounted disk is seen
#
while [ : ]; do
clear
printf "Waiting for CD/DVD to be inserted ...n"
mount | grep cd9660 >/dev/null 2>&1
[ "$?" = "0" ] && break
sleep 1
done
# good, run the image ripper
#
rip_iso
# skip this if we're running non-interactive
# assume the user wants it be done :-)
#
if [ "${force_non_interactive}" = "0" ]; then
# if we're running interactive, ask if
# user wants to rip another disc
#
printf "Rip another disc? [Y|n] "
read _answer < /dev/tty
echo ${_answer} | grep -E -i -e '^y$' > /dev/null 2>&1
[ "$?" != "0" ] && break
fi
done
# END #
|