bashunixcp

Copy all files with a certain extension from all subdirectories


Under unix, I want to copy all files with a certain extension (all excel files) from all subdirectories to another directory. I have the following command:

cp --parents `find -name \*.xls*` /target_directory/

The problems with this command are:

Any solutions for these problems?


Solution

  • --parents is copying the directory structure, so you should get rid of that.

    The way you've written this, the find executes, and the output is put onto the command line such that cp can't distinguish between the spaces separating the filenames, and the spaces within the filename. It's better to do something like

    $ find . -name \*.xls -exec cp {} newDir \;
    

    in which cp is executed for each filename that find finds, and passed the filename correctly. Here's more info on this technique.

    Instead of all the above, you could use zsh and simply type

    $ cp **/*.xls target_directory
    

    zsh can expand wildcards to include subdirectories and makes this sort of thing very easy.