Verknüpfen Sie alle Unterverzeichnisse in einem Verzeichnis mit einem anderen Verzeichnis


7

Ich versuche, jedes Verzeichnis in einem Ordner mit einem anderen Ordner zu verknüpfen. In der folgenden Struktur müssen beispielsweise die Unterordner mit Ordner2 verknüpft sein.

- /home/chris/folder1
-- subfolder1
-- subfolder2

- /home/john/folder2
-- subfolder1
-- subfolder2

Dies ist, was ich bisher versucht habe, aber meine Bash-Fähigkeiten sind verrostet und das funktioniert nicht.

find /home/chris/folder1 -type d -maxdepth 1 -mindepth 1 -exec ln -s {} /home/john/folder2/{} \;

Antworten:


12

Angenommen, dieses Layout:

% tree -L 2
.
├── top-1
└── top-2
    ├── sub-1
    ├── sub-2
    └── sub-3

Und diese gewünschte Ausgabe:

% tree -L 2
.
├── top-1
   ├── sub-1 -> /tmp/sf-582772/top-2/sub-1
   ├── sub-2 -> /tmp/sf-582772/top-2/sub-2
   └── sub-3 -> /tmp/sf-582772/top-2/sub-3
└── top-2
    ├── sub-1
    ├── sub-2
    └── sub-3

Und diese Version von find:

% find --version
find (GNU findutils) 4.4.2

Verwenden:

find /tmp/sf-582772/top-2/ -maxdepth 1 -mindepth 1 -type d -exec ln -s '{}' /tmp/sf-582772/top-1/ \;

Ersetzen Sie die hier angegebenen vollständigen Pfade durch die Verzeichnisse, die Sie benötigen. Hier ist eine Version mit relativen Pfaden:

% pwd
/tmp/sf-582772
% find top-2 -maxdepth 1 -mindepth 1 -type d -exec ln -s ../'{}' top-1/ \;

Gibt:

% tree -L 2
.
├── top-1
   ├── sub-1 -> ../top-2/sub-1
   ├── sub-2 -> ../top-2/sub-2
   └── sub-3 -> ../top-2/sub-3
└── top-2
    ├── sub-1
    ├── sub-2
    └── sub-3

1

Ich würde versuchen:

find /home/chris/folder1 -type d -maxdepth 1 -mindepth 1 -print0 | xargs -0 ln -s -t /home/john/folder2

Ich bin kein Fan des zu findenden -exec-Arguments und kein Fan davon, genau herauszufinden, wie man Literalen entkommt, also schwinge ich im Allgemeinen, um + xargs zu finden.


1

Vielleicht fehlt mir etwas, außer dass dies jedes Mal ausgeführt werden muss, wenn ein neues Verzeichnis unter base erstellt wird. Das funktioniert bei mir.

ln -s /base/* /target && ls -l /target

1
Dies wird alles miteinander verknüpfen, was gedacht wird. Wenn Sie es ausschließen müssen, wird es möglicherweise komplizierter.
FreeSoftwareServers

0

Nachdem ich auf die Antwort gestoßen war, die der Frage ähnelt, nach der der Fragesteller sucht, hatte ich gedacht, ich würde ein Update für zukünftige Leute hinzufügen, die sich das ansehen.

Der Schlüssel ist also sicherzustellen, dass das Zielverzeichnis noch nicht existiert!

Beispiel:

  1. Löschen Sie das Zielverzeichnis: target-directory
  2. Lauf: ln -s /path/to/base-directory/ /path/to/target-directory

Also für die ursprüngliche Frage:

  1. Löschen Sie das Verzeichnis: folder2
  2. Lauf: ln -s /home/chris/folder1/ /home/john/folder2

Ich hoffe das hilft.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.