it-swarm.com.de

Wie erstelle ich symbolische Links zu allen Dateien (Dateiklassen) in einem Verzeichnis?

Ich möchte symbolische Links (ln -s) zu allen Dateien (oder einer Dateiklasse, die beispielsweise mit .bar endet) in einem bestimmten Verzeichnis erstellen. Angenommen, ich bin in der CWD und Typ ls ../source/*.bar gibt mir

foo.bar
baz.bar

wie kann ich die Parameterliste an ln -s übergeben, in den sie schließlich aufgelöst wird?

ln -s ../source/foo.bar
ln -s ../source/baz.bar

Natürlich weiß ich, dass ich ein Bash-Skript schreiben kann, aber es sollte etwas Einfacheres geben, das xargs beinhaltet, oder so, da es eine übliche Aufgabe zu sein scheint - zumindest für mich.

35
dastrobu

ln akzeptiert mehrere Argumente, aber vergessen Sie nicht, in diesem Fall ein Zielverzeichnis anzugeben.

In Ihrem Beispiel ist . das Zielverzeichnis, daher sollte es so einfach wie möglich sein

ln -s ../source/*.bar .

From man ln; Der obige Befehl verwendet die 3. Form:

ln [OPTION]... [-T] TARGET LINK_NAME   (1st form)
ln [OPTION]... TARGET                  (2nd form)
ln [OPTION]... TARGET... DIRECTORY     (3rd form)
ln [OPTION]... -t DIRECTORY TARGET...  (4th form)
  • Erstellen Sie im ersten Formular einen Link zu TARGET mit dem Namen LINK_NAME.
  • Erstellen Sie im 2. Formular einen Link zu TARGET im aktuellen Verzeichnis.
  • Erstellen Sie in der 3. und 4. Form Verknüpfungen zu jedem ZIEL im VERZEICHNIS.
67
mpy

Verwende find

certainDir="/path/to/dir"
find -name "*.bar" -exec ln -s {} "$certainDir" \;

Denken Sie auch daran, vollständige Pfade (soweit möglich) mit Symlinks zu verwenden.

3
justbrowsing

Sie können entweder mit globstar rekursiv versuchen (bash/zsh gesetzt durch: shopt -s globstar):

ls -vs ../**/*.bar .

Hinweis: -v für ausführlich hinzugefügt.

Oder wenn die Liste zu lang ist, verwenden Sie das Dienstprogramm find:

find .. -name \*.bar -exec ln -vs "{}" dest/ ';'

Dadurch werden Links in dest/ erstellt oder in . für den aktuellen Ordner geändert.

3
kenorb

cp mit der Option -s kann weiche Links erstellen (oder -l für harte Links).

Aus dem aktuellen Verzeichnis kann folgendermaßen verwendet werden:

$ cp -s ../path/with/scripts/* .

In deinem Fall wird es so sein:

$ cp -s ../source/*.bar .
0
cy8g3n