Poiché find ha un'opzione di esclusione, usa find + xargs + mv:
find /source/directory -name ignore-directory-name -prune -print0 | xargs -0 mv --target-directory=/target/directory
 Nota che questo è quasi copiato dalla pagina man find (penso che usare mv --target-directory sia meglio di cpio).
Supponiamo che la struttura dir sia come,
|parent
    |--child1
    |--child2
    |--grandChild1
    |--grandChild2
    |--grandChild3
    |--grandChild4
    |--grandChild5
    |--grandChild6
 E dobbiamo spostare i file in modo che appaiano come
|parent
    |--child1
    |   |--grandChild1
    |   |--grandChild2
    |   |--grandChild3
    |   |--grandChild4
    |   |--grandChild5
    |   |--grandChild6
    |--child2
 
 In questo caso, devi escludere due directory child1 e child2 e sposta il resto delle directory in child1 cartella.
usa,
mv !(child1|child2) child1
 
 Questo sposterà tutto il resto delle directory in child1 cartella.
Questo non è esattamente quello che hai chiesto, ma potrebbe fare il lavoro:
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
 (Essenzialmente, sposta la cartella esclusa fuori dall'albero più grande da spostare.)
 Quindi, se ho a/ e voglio escludere a/b/c/* :
mv a/b/c ../c
mv a final_destination
mkdir -p a/b
mv ../c a/b/c
 
 O qualcosa di simile. Altrimenti, potresti ottenere find per aiutarti.
Per prima cosa ottieni i nomi di file e cartelle ed escludi quello che vuoi:
ls --ignore=file1 --ignore==folder1 --ignore==regular-expression1 ...
 
 Quindi passa i nomi filtrati a mv poiché il primo parametro e il secondo parametro saranno la destinazione:
mv $(ls --ignore=file1 --ignore==folder1 --ignore==regular-expression1 ...) destination/