How can I selectively copy files from one directory to another directory?

5,318

Solution 1

In addition to eboix's find command (which as it stands breaks on whitespace, I'll put a safer way or two at the end), you can use bash's extglob feature:

# turn extglob on
shopt -s extglob 
# move everything but the files matching the pattern
mv dir1/!(*.c) -t dir2
# If you want to exclude more patterns, add a pipe between them:
mv dir1/!(*.c|*.txt) -t dir2

See the bash man page for more you can do with extglob. Note that this is not recursive and so will only move files in dir1 directly, not subdirectories. The find method is recursive.


Safer find commands:

find dir1 ! -name '*.c' -print0 | xargs -0 mv -t dir2
find dir1 ! -name '*.c' -exec mv -t dir2 {} +

For more patterns, just add more ! -name statements:

find dir1 ! -name '*.c' ! -name '*.txt' -print0 | xargs -0 mv -t dir2
find dir1 ! -name '*.c' ! -name '*.txt' -exec mv -t dir2 {} +

Solution 2

Try this:

find ./ ! -name '*.c' | xargs -i cp {} dest_dir
Share:
5,318

Related videos on Youtube

Gerald Gonzales
Author by

Gerald Gonzales

Updated on September 18, 2022

Comments

  • Gerald Gonzales
    Gerald Gonzales over 1 year

    On Linux, how do I selectively copy most – but not all – files from a directory (dir1) to another directory (dir2)?

    I do not want to copy *.c and *.txt files to dir2.

    The cp man page online cannot help me.

  • Kevin
    Kevin over 12 years
    This will break on whitespace, you should add -print0 / -0 or use -exec.
  • Admin
    Admin over 12 years
    Or don't use filenames with embedded blanks or special characters (frankly, a good idea!)
  • Gerald Gonzales
    Gerald Gonzales over 12 years
    thanks, what if I want to avoid two or more files ? for example, '.c' or '.txt' ?
  • Kevin
    Kevin over 12 years
    @user1002288 You add more ! -name ... statements, I've updated my answer to show this.