Puisque find a une option d'exclusion, utilisez find + xargs + mv :
find /source/directory -name ignore-directory-name -prune -print0 | xargs -0 mv --target-directory=/target/directory
Notez que ceci est presque copié de la page de manuel de recherche (je pense que l'utilisation de mv --target-directory est meilleure que cpio).
Supposons que la structure du répertoire ressemble à,
|parent
|--child1
|--child2
|--grandChild1
|--grandChild2
|--grandChild3
|--grandChild4
|--grandChild5
|--grandChild6
Et nous devons déplacer les fichiers pour qu'ils ressemblent à,
|parent
|--child1
| |--grandChild1
| |--grandChild2
| |--grandChild3
| |--grandChild4
| |--grandChild5
| |--grandChild6
|--child2
Dans ce cas, vous devez exclure deux répertoires child1
et child2
, et déplacez le reste des répertoires dans child1
répertoire.
utiliser,
mv !(child1|child2) child1
Cela déplacera tous les autres répertoires dans child1
répertoire.
Ce n'est pas exactement ce que vous avez demandé, mais cela pourrait faire l'affaire :
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
(Essentiellement, déplacez le dossier exclu hors de l'arborescence plus grande à déplacer.)
Donc, si j'ai a/
et je veux exclure a/b/c/*
:
mv a/b/c ../c
mv a final_destination
mkdir -p a/b
mv ../c a/b/c
Ou quelque chose comme ça. Sinon, vous pourrez peut-être obtenir find
pour vous aider.
Obtenez d'abord les noms des fichiers et des dossiers et excluez ceux que vous voulez :
ls --ignore=file1 --ignore==folder1 --ignore==regular-expression1 ...
Passez ensuite les noms filtrés à mv
comme premier paramètre et le deuxième paramètre sera la destination :
mv $(ls --ignore=file1 --ignore==folder1 --ignore==regular-expression1 ...) destination/