Comment utiliser la commande ' mv ' pour déplacer des fichiers à l'exception de ceux dans un répertoire spécifique?

Je me demande - Comment puis-je déplacer tous les fichiers dans un répertoire sauf ceux dans un répertoire spécifique (car 'mv' n'a pas d'option '--exclude')?

30
demandé sur Tunaki 2011-01-06 08:52:02

4 réponses

Supposons que la structure dir est comme,

|parent
    |--child1
    |--child2
    |--grandChild1
    |--grandChild2
    |--grandChild3
    |--grandChild4
    |--grandChild5
    |--grandChild6

Et nous devons déplacer des fichiers afin qu'il apparaisse comme,

|parent
    |--child1
    |   |--grandChild1
    |   |--grandChild2
    |   |--grandChild3
    |   |--grandChild4
    |   |--grandChild5
    |   |--grandChild6
    |--child2

Dans ce cas, vous devez exclure les deux répertoires child1 et child2, et déplacer le reste de l'répertoires de child1 répertoire.

Utilisation,

mv !(child1|child2) child1

Cela déplacera tout le reste des répertoires dans le répertoire child1.

57
répondu Chathura Kulasinghe 2013-08-09 09:18:57

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é à partir de la page de manuel de recherche (je pense que l'utilisation de MV --target-directory est meilleure que cpio).

3
répondu Slartibartfast 2011-01-06 06:08:00

Ce n'est pas exactement ce que vous avez demandé, mais cela pourrait faire le travail:

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 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 pourriez être en mesure d'obtenir find pour vous aider.

1
répondu Thanatos 2011-01-06 05:56:14

Cela déplacera tous les fichiers au niveau ou en dessous du répertoire courant qui ne se trouve pas dans le ./exclure/ répertoire /de la mesure...

find -E . -not -type d -and -not -regex '\./exclude/.*' -exec echo mv {} /wherever \;
1
répondu sjr 2011-01-06 06:10:31