Thursday, January 23, 2014

Using the OS X Terminal instead of the Finder to copy files effectively

The Finder's abilities to copy files is usually adequate, but sometimes when managing large data transfers it can introduce some burdensome quirks.

While in OS X people often copy individual files or small groups of files between locations using the Finder, there are times when you might copy hundreds if not thousands of files at a time, especially for the purposes of backing up or migrating data from one drive to another. For the most part, the Finder's copying process is perfectly adequate for moving these files; unfortunately it does have some drawbacks that can hinder the copying process.

When the Finder copies files, it first catalogs all files to be copied and then treats the copy process as one all-or-nothing copy routine. Because of this, if you copy multiple files and there is an error in accessing one, then the system will cancel the entire process and revert the system to its state before the files were moved. This setup is good from some standpoints since it ensures that all files were copied properly; however, it can be frustrating if you are trying to recover as many files as possible from one location such as a hard drive with bad sectors.

One approach to overcoming errors that prevent a full copy process is to copy in smaller batches, but this can be time-consuming and impede on organization. Another approach that may be more successful is to use the OS X Terminal to perform the copy. There are several commands that can be used to copy files from one location to the next in the Terminal, and using them is fairly straightforward.

First ensure that you have both the source files and your copy destination mounted and available on your system so you can see them in the Finder. Then open the OS X Terminal and perform the following steps:

1. Enter your copy command and options.
There are many commands that can copy files, but the three most common ones are "cp" (copy), "rsync" (remote sync), and "ditto." As with any terminal command, each of these is a separate program that can take optional flags to tailor its behaviors for your needs, such as allowing it to preserve permissions on the copied files, or allow it to copy recursively into directories, and so on. These options can be looked up in the manual pages for each program, which can be done by typing "man cp" or "man ditto" in a Terminal window (or doing a Google search), but for most purposes the following options should be adequate:

cp -av

rsync -av

ditto -v

2. Specify your source files
With one of the above commands and flags typed, continue by typing a single space and then drag the parent folder of your source files to the Terminal window. When you do this the full path to the folder will be input at the cursor along with a single space. Remove this space by pressing the delete key once, and then type "/*" to tell the command to specify all items within the parent folder (otherwise the parent folder itself will be the target). At this point the command should look similar to the following:

rsync -av /path/to/source/*

3. Specify your destination folder
After you have entered the slash and asterisk characters, enter a space and then locate the folder where you would like to copy the files and drag it to the Terminal window. As with the source folder this should enter the full path to the destination folder. This time instead of adding a slash and an asterisk to the end, only add a single slash so the command looks like the following:

rsync -av /path/to/source/* /path/to/destination/

This command now tells the computer to run the "rsync" command (or other copy command you've chosen), and use the "a" and "v" options for this command (in this case they are for "archiving" and "verbose" mode to ensure all files are copied as-is and list them as they are being copied). It then tells the system to target all files within the source directory and put them within the destination directory. At this point, pressing Enter will run the command, and copy the files.

Unlike the Finder's copy process, if an error occurs, then these commands will leave the successfully copied files and likely output a warning or other reason why the error occurred, and also provide an active list of the files that were copied so you can both determine what was successful and what caused any errors, and be able to address the problem only for the faulty files instead of having to copy everything over and over again.

No comments: