2016-04-04 9 views
2

Angenommen, ich habe ein Verzeichnis mit zwei Unterverzeichnissen A und G. Verzeichnis A enthält zwei Unterverzeichnisse (B und C). Verzeichnis B enthält auch zwei Unterverzeichnisse (D und E). Schließlich Verzeichnis D enthält Verzeichnis F.Bash: Verschieben Sie alle Verzeichnisse, in denen der Verzeichnispfad keine bestimmte Zeichenfolge enthält

. 
├── A 
│   ├── B 
│   │   ├── D 
│   │   │   └── F 
│   │   └── E 
│   └── C 
└── G 

Nun möchte ich alle Verzeichnisse bewegen, wo ihr Weg enthalten B/D Verzeichnis G. nicht ich bin im obersten Verzeichnis Unter der Annahme, in der A und G existieren, ich versuche, diesen Befehl ein:

$shopt -s extglob 
    $mv !(*B/D*) ./G 

Aber ich bin immer diese Fehlermeldung: mv: rename !(*B/D*) to ./G/*: No such file or directory. Irgendwelche Ideen? Ich bin auch offen für andere Wege, das Problem zu lösen.

+0

Ich nehme an Sie haben eine ganze Menge mehr Verzeichnisse als die in der Realität? Ansonsten ist die einfache Antwort nur mv ./A/B/E ./A/B.C ./G –

+0

Natürlich! Und der Name der Verzeichnisse ist nicht statisch. Sie könnten alles sein. – media

Antwort

0

Mit find:

find A/ -depth -type d -not \(-name *A* -o -name *B* -o -name *D* \) -exec mv -t G/ {} + 

Beispiel:

$ tree 
. 
├── A 
│   ├── B 
│   │   ├── D 
│   │   │   └── F 
│   │   └── E 
│   └── C 
└── G 

$ find A/ -depth -type d -not \(-name *A* -o -name *B* -o -name *D* \) -exec mv -t G/ {} + 

$ tree 
. 
├── A 
│   └── B 
│    └── D 
└── G 
    ├── C 
    ├── E 
    └── F 

Wenn Ihr mv nicht über -t Option:

find A/ -depth -type d -not \(-name *A* -o -name *B* -o -name *D* \) -exec mv {} G/ \; 
+0

Ich erhalte diesen Fehler: mv: illegale Option - t – media

+0

@media Überprüfen Sie meine Änderungen .. – heemayl

+0

Das Problem mit der Antwort ist, dass es Verzeichnis F verschiebt, die nicht sollte, weil ABDF BD enthält. Es hält nur ABD, aber es sollte ABDF sein. – media

0

Hier ist die richtige Antwort:

find A/ -depth -type d -not \(-wholename "*B" \) -not \(-wholename "*B/D*" \) -exec sh -c 'mkdir -p G/`dirname "{}"`; mv "{}" G/`dirname "{}"`' \; 
Verwandte Themen