Copy directory from ext3 to FAT32 ignoring symlinks, pipes, etc

1

I'm trying to write a shell script in which I recursively copy a directory to a USB stick. I need the return value of the copy operation for error-checking purposes. I've tried

cp -a /var/mydir /media/usbdrive

and

cp -r /var/mydir /media/usbdrive

as well as a few others, but the problem is that I always get errors such as:

Cannot create fifo: /path/to/fifo Operation not permitted

Whilst these are warnings and the copy operation continues, I get a non-successful error code returned from the operation which messes up the error handling in my script. How can I copy recursively and ignore fifos, symlinks, and other entities that are not valid on a FAT32 file system?

user17867

Posted 2009-11-13T11:13:31.750

Reputation: 113

Answers

2

You should be able to do this using the find command. The -type option allows you to restrict the kinds of files you find, so you can ignore symlinks and pipes etc., and the -exec option allows you to run a command for each of the files you find.

First create all the directories on the USB stick:

cd /var/mydir
find * -type d -exec mkdir /media/usbdrive/{} \;

Then copy all the plain files:

cd /var/mydir
find . -type f -exec cp {} /media/usbdrive/{} \;

Dave Webb

Posted 2009-11-13T11:13:31.750

Reputation: 10 126

Also works well on Kingston USB stick in this location + usefull to batch test these damned small storage devices with default FAT 32 FS, on Linux. Thank you @Dave Webb – tuk0z – 2015-09-05T19:44:11.317