%20in%20einem%20Verzeichnis%3F.png)
Ich möchte symbolische Links ( ln -s
) zu allen Dateien (oder einer Klasse von Dateien, z. B. mit der Endung .bar
) in einem bestimmten Verzeichnis erstellen. Angenommen, ich bin im cwd und type ls ../source/*.bar
gibt mir
foo.bar
baz.bar
wie kann ich die Parameterliste übergeben, in ln -s
die es sich schließlich auflöst
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 etwas damit zu tun hat xargs
oder so, da es – zumindest für mich – eine gängige Aufgabe zu sein scheint.
Antwort1
ln
nimmt mehrere Argumente an, aber vergessen Sie in diesem Fall nicht, ein Zielverzeichnis anzugeben.
In Ihrem Beispiel .
ist das Zielverzeichnis also so einfach wie
ln -s ../source/*.bar .
Von 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 1. 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 Links zu jedem ZIEL im VERZEICHNIS.
Antwort2
Sie können es rekursiv versuchen, indem Sie entweder globstar verwenden (bash/zsh festgelegt durch: shopt -s globstar
):
ls -vs ../**/*.bar .
Hinweis: -v
Für ausführliche Ausführung hinzugefügt.
Oder wenn die Liste zu lang ist, verwenden Sie find
das Dienstprogramm:
find .. -name \*.bar -exec ln -vs "{}" dest/ ';'
Dadurch werden Links in erstellt dest/
oder es wird .
für den aktuellen Ordner geändert.
Antwort3
Verwendenfind
certainDir="/path/to/dir"
find -name "*.bar" -exec ln -s {} "$certainDir" \;
Denken Sie auch daran,vollständige Pfade(wo möglich) mit symbolischen Links.
Antwort4
cp
Mit -s
der Option können Softlinks (oder -l
Hardlinks) erstellt werden.
Aus dem aktuellen Verzeichnis kann es folgendermaßen verwendet werden:
$ cp -s ../path/with/scripts/* .
In Deinem Fall sieht das dann so aus:
$ cp -s ../source/*.bar .