Home » Linux » How to use 'mv' command to move files except those in a specific directory?

How to use 'mv' command to move files except those in a specific directory?

Posted by: admin November 29, 2017 Leave a comment


I am wondering – how can I move all the files in a directory except those files in a specific directory (as ‘mv’ does not have a ‘–exclude’ option)?


Lets’s assume the dir structure is like,


And we need to move files so that it would appear like,

    |   |--grandChild1
    |   |--grandChild2
    |   |--grandChild3
    |   |--grandChild4
    |   |--grandChild5
    |   |--grandChild6

In this case, you need to exclude two directories child1 and child2, and move rest of the directories in to child1 directory.


mv !(child1|child2) child1

This will move all of rest of the directories into child1 directory.


Since find does have an exclude option, use find + xargs + mv:

find /source/directory -name ignore-directory-name -prune -print0 | xargs -0 mv --target-directory=/target/directory

Note that this is almost copied from the find man page (I think using mv –target-directory is better than cpio).


This isn’t exactly what you asked for, but it might do the job:

mv the-folder-you-want-to-exclude somewhere-outside-of-the-main-tree
mv the-tree where-you-want-it
mv the-excluded-folder original-location

(Essentially, move the excluded folder out of the larger tree to be moved.)

So, if I have a/ and I want to exclude a/b/c/*:

mv a/b/c ../c
mv a final_destination
mkdir -p a/b
mv ../c a/b/c

Or something like that. Otherwise, you might be able to get find to help you.


This will move all files at or below the current directory not in the ./exclude/ directory to /wherever…

find -E . -not -type d -and -not -regex '\./exclude/.*' -exec echo mv {} /wherever \;