2016-11-02 1 views
3

Ich habe zwei Unterverzeichnisse in /home/ziga/Mounted/. Jede dieser mehrere nicht leere Unterverzeichnisse hat:So erstellen Sie ein Duplikat von Unterverzeichnissen mit Suche

/home/ziga/Mounted/dir1/subdir1-1 
/home/ziga/Mounted/dir1/subdir1-2 
... 

/home/ziga/Mounted/dir2/subdir2-1 
/home/ziga/Mounted/dir2/subdir2-2 
... 

Gibt es eine Möglichkeit find zu verwenden leer Verzeichnisse in zu erstellen, sagen /home/ziga/CombinedMounts, die genau dieselben Namen haben wie die würde, die auf zwei Ebenen tief in /home/ziga/Mounted/? Dies ist das Endergebnis ich suche:

/home/ziga/CombinedMounts/subdir1-1 
/home/ziga/CombinedMounts/subdir1-2 
/home/ziga/CombinedMounts/subdir2-1 
/home/ziga/CombinedMounts/subdir2-2 
... 

ich die Liste der Verzeichnisse erhalten kann diesen Befehl:

find /home/ziga/Mounted/ -maxdepth 2 -mindepth 2 -type d ! -name "lost+found" ! -name ".Trash*" -exec basename {} \; 

Aber ich kann nicht für das Leben von mir herauszufinden, wie zu verwenden seine Ausgabe in mkdir -p, damit ich die gewünschten Unterverzeichnisse bekommen würde.

Irgendwie landen sie immer in /home/ziga/CombinedMounts/home/ziga/Mounted/...

ich meinen Verstand zu verlieren, bitte helfen Sie. :)

HINWEIS: einige der Verzeichnisnamen enthalten Leerzeichen!

+0

Können Sie die Ergebnisse als Elemente eines Arrays festlegen? Wie 'DIRS = (\' \ ')'. Verwenden Sie dann ein 'for dir in $ DIRS', um jedes Verzeichnis zu erstellen. – Gavin

+0

Würde das funktionieren, wenn Leerzeichen in den Verzeichnisnamen vorhanden wären? – zigamilek

+0

Oh, vielleicht nicht. Ich bin kein Bash-Experte, spucke nur hier. – Gavin

Antwort

2

Try this:

find /home/ziga/Mounted/ -maxdepth 2 -mindepth 2 \ 
    -type d ! -name "lost+found" ! -name ".Trash*" \ 
    -exec sh -c 'mkdir -p /home/ziga/CombinedMounts/"$(basename "$0")"' "{}" \; 

ich nur die Teile erklären werde, dass Sie nicht in der Frage erwähnt haben.

Wir haben sh aufgerufen, weil wir den {} Platzhalter nicht zuverlässig an einen Ausdruck wie mkdir -p "/path/$(basename "{}")" übergeben können. Der Ausdruck sieht auch mit dem Platzhalter unklar aus.

-c Die Option wird der Wert des Parameters 0 aus dem Wert des Operanden nach der Befehlsfolge (siehe die Manpage sh):

-c Lesen aus dem command_string Operanden-Befehle. Setzen Sie den Wert des Sonderparameters 0 (siehe Abschnitt 2.5.2, Sonderparameter) aus dem Wert des Operanden command_name und den Positionsparametern ($1, $2 usw.) der Reihe nach aus den übrigen Argumentoperanden. Aus der Standardeingabe sollen keine Befehle gelesen werden.

+0

Erstaunlich! Das ist es! :) – zigamilek

+0

Danke für die ausführliche Antwort und vor allem die korrekten Positionen aller Arten von Anführungszeichen und Klammern;) Die kriegen mich immer wütend. Nachdem Sie mir für ein paar Stunden den Kopf gestoßen haben, präsentieren Sie mir die Lösung in wenigen Minuten. Danke noch einmal! – zigamilek

Verwandte Themen