Erstellen Sie mithilfe von Platzhaltern symbolische Links zu Dateien

7

Ich möchte Symlinks zu mehreren Dateien erstellen:

ln -s dev-*.php 's/dev-(.*\.php)/$1/'

Results hoped for:  
    site.php links to dev-site.php  
    file.php links to dev-file.php

Was ist der prägnanteste Weg, um dies zu erreichen?

Gbentley
quelle

Antworten:

10

Wenn sich alles im selben Verzeichnis befindet, können Sie so etwas in bash oder einer anderen Bourne-ähnlichen / POSIX-Shell ausführen:

for FILE in dev-*; do ln -s "$FILE" "${FILE#dev-}"; done

Dies würde Symlinks ohne "dev-" zu Dateien erstellen, die mit "dev-" beginnen.

James Thompson
quelle
Der Code-Formatierer mag anscheinend das Format $ {param # word} nicht. In diesem Zusammenhang wird das # nicht als Kommentar behandelt, sondern als Anweisung, dev- aus dem in FILE gespeicherten Wert zu entfernen
James Thompson
${FILE#dev-}Ich muss mich nur um Dateinamen mit lustigen Charakteren kümmern ... und das ist ein Bashishm, AFAIU (definitiv nicht /bin/shauf Solaris Weg zurück).
vonbrand
1
@vonbrand ${FILE#dev-}ist nicht Bourne, sondern POSIX (wurde von ksh eingeführt, nicht von bash). Sie müssen --für lndas Ende der Optionen für ein markieren *Muster, oder besser gesagt, ein verwenden dev-*Muster. Der Code, wie er ist, würde in jedem Unterverzeichnis des aktuellen Verzeichnisses, mit dessen Namen nicht beginnt, Symlinks zu sich selbst erstellen dev-. Siehe auch die Hinweise in meiner Antwort.
Stéphane Chazelas
Vielen Dank an alle für Ihre Hilfe und Erklärungen. Hinzufügen dev-*statt *hier wie vorgesehen funktioniert - da der Code darüber steht, wird versucht, Symlinks für jede Datei zu erstellen .
Gbentley
5

Normalerweise benutze ich einen kurzen Einzeiler.

for file in dev-*.php; do ln -s $file $(echo "$file" | sed 's/^dev-//'); done

Dies durchläuft die 'dev - *. Php'-Dateien, erhält den neuen Namen ohne' dev- 'und erstellt dann den Symlink.

Arcege
quelle
2

Mit würden zshSie tun:

autoload zmv # typically in ~/.zshrc
zmv -Lsv 'dev-(*.php)' '$1'

Mit bashoder anderen POSIX-Shells (einschließlich zsh):

for f in dev-*.php; do
  ln -s "$f" "${f#dev-}"
done

Beachten Sie, dass, wenn site.phpvorhanden und ein Verzeichnis (oder ein Symlink zu einem Verzeichnis) ist, möglicherweise ein dev-site.phpSymlink darin enthalten ist. Mit GNU lnkönnten Sie die Add - -TOption dagegen zu schützen (mit zmvEinsatz , -o -Tum die Pass - -TOption bis zu ln).

Stéphane Chazelas
quelle