web-dev-qa-db-fra.com

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

Je me demande - comment puis-je déplacer tous les fichiers dans un répertoire à l'exception de ces fichiers dans un répertoire spécifique (car 'mv' n'a pas d'option '--exclude')?

36
David Liu

Supposons que la structure dir soit comme,

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

Et nous devons déplacer des fichiers pour qu'ils apparaissent comme,

|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.

utilisation,

mv !(child1|child2) child1

Cela déplacera tous les autres répertoires dans child1 répertoire.

69

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

3
Slartibartfast

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 la plus grande arborescence à 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 obtenir find pour vous aider.

1
Thanatos

Cela déplacera tous les fichiers dans ou en dessous du répertoire courant ne se trouvant pas dans le répertoire ./exclude/ vers/n'importe où ...

find -E . -not -type d -and -not -regex '\./exclude/.*' -exec echo mv {} /wherever \;
1
sjr
#!/bin/bash

touch Apple  banana  carrot  dog  cherry

mkdir fruit

F="Apple  banana  carrot  dog cherry"

mv ${F/dog/} fruit

# cela supprime 'dog' de la liste OF, donc il reste dans le répertoire courant et n'est pas déplacé vers 'fruit'

0
Chris Reid
ls | grep -v exclude-dir | xargs -t -I '{}' mv {} exclude-dir
0
xyz