Dado que find tiene una opción de exclusión, use find + xargs + mv:
find /source/directory -name ignore-directory-name -prune -print0 | xargs -0 mv --target-directory=/target/directory
Tenga en cuenta que esto casi se copia de la página de manual de búsqueda (creo que usar mv --target-directory es mejor que cpio).
Supongamos que la estructura de directorios es como,
|parent
|--child1
|--child2
|--grandChild1
|--grandChild2
|--grandChild3
|--grandChild4
|--grandChild5
|--grandChild6
Y necesitamos mover los archivos para que aparezcan como,
|parent
|--child1
| |--grandChild1
| |--grandChild2
| |--grandChild3
| |--grandChild4
| |--grandChild5
| |--grandChild6
|--child2
En este caso, debe excluir dos directorios child1
y child2
y mueva el resto de los directorios a child1
directorio.
usar,
mv !(child1|child2) child1
Esto moverá el resto de los directorios a child1
directorio.
Esto no es exactamente lo que pediste, pero podría funcionar:
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
(Esencialmente, mueva la carpeta excluida fuera del árbol más grande para moverla).
Entonces, si tengo a/
y quiero excluir a/b/c/*
:
mv a/b/c ../c
mv a final_destination
mkdir -p a/b
mv ../c a/b/c
O algo así. De lo contrario, es posible que pueda obtener find
para ayudarte.
Primero obtenga los nombres de los archivos y carpetas y excluya los que desee:
ls --ignore=file1 --ignore==folder1 --ignore==regular-expression1 ...
Luego pase los nombres filtrados a mv
como primer parámetro y el segundo parámetro será el destino:
mv $(ls --ignore=file1 --ignore==folder1 --ignore==regular-expression1 ...) destination/