Skip to content

Instantly share code, notes, and snippets.

@swrobel
Forked from kabadisha/dedup-imovie-library
Last active September 30, 2017 20:26
Show Gist options
  • Save swrobel/1fa71ea870a4d0feac2a6ca93b5e36eb to your computer and use it in GitHub Desktop.
Save swrobel/1fa71ea870a4d0feac2a6ca93b5e36eb to your computer and use it in GitHub Desktop.
When you import movies into iMovie 10 libraries, the file is always copied, wasting space and hindering editability. This script replaces the copy with a hardlink, reclaiming disk space.
#!/usr/bin/env ruby
# Usage: dedup-imovie-library LIBRARY ORIGINALS
#
# Goes through an iMovie 10 library and replaces all the "Original Media" with
# symlinks to the actual original media, in order to conserve disk space. Note
# that because they're symlinks, if the path to the originals changes (e.g. you
# rename the external drive they are on) then the links will be broken.
#
# This assumes you've already imported the files into iMovie and waited for them
# all to be copied.
#
# This also assumes movie files in LIBRARY have unique matches in ORIGINALS with
# the same filename!
#
# This script will also check that the file is indeed a duplicate before deleting it and creating a link
require 'fileutils'
library = ARGV.shift
originals = ARGV.shift
fail "Library #{library} does not exist" unless library && File.exist?(library)
fail "You must use an absolute path for the originals directory" if originals.start_with?( '..')
fail "Originals folder #{originals} does not exist" unless originals && File.exist?(originals)
# For each original file in the imovie library
Dir.glob(File.join(library, '**', 'Original Media', '*')) do |library_file|
next unless File.file? library_file
# Skip it if we've already replaced it with a symlink
next if File.lstat(library_file).symlink?
# Look for a file in the originals path with the same filename (case-insensitive)
original = Dir.glob(File.join(originals, '**', File.basename(library_file)), File::FNM_CASEFOLD).first
next unless original
# Make sure file contents are identical
next unless FileUtils.compare_file library_file, original
puts "Linking #{library_file} => #{original}"
FileUtils.rm_f library_file, verbose: true
# Replace with a symlink
FileUtils.ln_s original, library_file, verbose: true
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment