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
Related videos on Youtube
Author by
Gerald Gonzales
Updated on September 18, 2022Comments
-
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 todir2
.The
cp
man page online cannot help me. -
Kevin over 12 yearsThis will break on whitespace, you should add
-print0
/-0
or use-exec
. -
Admin over 12 yearsOr don't use filenames with embedded blanks or special characters (frankly, a good idea!)
-
Gerald Gonzales over 12 yearsthanks, what if I want to avoid two or more files ? for example, '.c' or '.txt' ?
-
Kevin over 12 years@user1002288 You add more
! -name ...
statements, I've updated my answer to show this.