Ich habe ein Verzeichnis foo
mit Unterverzeichnissen. Ich möchte die gleichen Unterverzeichnisnamen in einem anderen Verzeichnis erstellen, ohne deren Inhalt zu kopieren. Wie mache ich das?
Gibt es eine Möglichkeit, eine ls
Ausgabe als Klammererweiterungsliste zu erhalten?
find
die Interpolation{}
in einen anderen String unterstützt./source/dir/path
, dann könnte dies mit einer „Argumentliste zu lang“ fail Fehler , wenn die Shell versucht, rufen Siefind
mit der Erweiterung der*
. Besser nur.
dort zu verwenden. Die meistenfind
Implementierungen können{}
auch verwendet werden, wenn sie mit einer anderen Zeichenfolge verknüpft sind, dies ist jedoch nicht universell..
Statt*
in diesem Fall verwenden. (Die Verwendung von xarg für Leistung und Sicherheit würde wahrscheinlich ein externes Skript für dieVerwenden von
rsync
:Dies würde die Verzeichnisstruktur
/some/path/dir
wiedir
im aktuellen Verzeichnis neu erstellen , ohne Dateien zu kopieren.Jedes Verzeichnis, das im Quellpfad gefunden wird, wird aufgrund des Einschlussmusters am Ziel erstellt, alles andere wird jedoch ausgeschlossen. Als Nebeneffekt von using
-a
(--archive
) erhalten Sie für alle Unterverzeichnisse im Ziel dieselben Zeitstempel wie in der Quelle. Dies funktioniert auch zum Erstellen lokaler Verzeichnisstrukturen aus Remote-Verzeichnissen (und umgekehrt).quelle
rsync
!Sie können
find
die Quellstruktur durchlaufen undmkdir
jedes Verzeichnis aufrufen, auf das sie trifft.In diesem Beispiel wird mit verwendet
find
, um Ihre Verzeichnisstruktur vonfoo
nach zu kopieren/tmp/another/
Die
exec
Schleife baut die darunter liegenden Verzeichnisse auffoo
, die dann an die übergeben werdenmkdir
. Wenn Sie keine Version davon habenfind
,+
können Sie diese\;
auf Kosten der Effizienz verwenden. Ersetzen Siemkdir
durch, umecho mkdir
zu sehen, was passieren würde, ohne es tatsächlich zu tun.quelle
... -exec sh -c 'for dirpath do mkdir -p "/some/path/$dirpath"; done' sh {} +
find: In ‘-exec ... {} +’ the ‘{}’ must appear by itself, but you specified ‘/tmp/another/{}’
(es funktioniert jedoch mit-exec ... \;
)/path/to/{}
aber ich kann jetzt keine Version finden, in der es funktioniert, also habe ich die Lösung angepasst. Vielen DankMit der Bash-Shell können Sie nach der Erweiterung jedes Verzeichnisses mit der
globstar
Option fragen :und kopieren Sie dann die Verzeichnisse mit einer Schleife:
... oder wenn Sie dachten, sie würden alle in einen Anruf passen
mkdir
:Das ist die Bash-Array-Syntax, die besagt: "Nehmen Sie jedes Element des
$@
Arrays und ersetzen Sie den Anfang jedes Elements durch/path/to/dest/
.Mir ist keine Möglichkeit bekannt,
ls
direkt als Klammererweiterungsliste auszugeben. Wenn Sie versuchen, die Ausgabe der**/
Erweiterung in eine Klammererweiterung zu massieren , müssen Sie Folgendes beachten:{
oder einer${
SequenzIch würde es nicht empfehlen.
quelle
Die Frage ist ein Cross-Site-Duplikat von /superuser/1389580/copy-directory-structure-only-at-year-end
Diese Art von Aufgabe ist ein klassischer Anwendungsfall für
mtree
:Das obige erstellt alle Verzeichnisse unter
new-tree
, die unter vorhanden warenold-tree
.mtree
setzt jedoch keine Zeitstempel für neu erstellte Verzeichnisse, sodass der resultierende Baum folgendermaßen aussieht:Wenn Sie möchten, dass die
new-tree
Zeitstempel mit denen in übereinstimmenold-tree
, führen Sie sie einfachmtree
erneut aus. Da die Verzeichnisse bereits vorhanden sind,mtree
werden die Zeitstempel an die Quellenspezifikation angepasst:quelle