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?
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.
${FILE#dev-}
Ich muss mich nur um Dateinamen mit lustigen Charakteren kümmern ... und das ist ein Bashishm, AFAIU (definitiv nicht/bin/sh
auf Solaris Weg zurück).${FILE#dev-}
ist nicht Bourne, sondern POSIX (wurde von ksh eingeführt, nicht von bash). Sie müssen--
fürln
das Ende der Optionen für ein markieren*
Muster, oder besser gesagt, ein verwendendev-*
Muster. Der Code, wie er ist, würde in jedem Unterverzeichnis des aktuellen Verzeichnisses, mit dessen Namen nicht beginnt, Symlinks zu sich selbst erstellendev-
. Siehe auch die Hinweise in meiner Antwort.dev-*
statt*
hier wie vorgesehen funktioniert - da der Code darüber steht, wird versucht, Symlinks für jede Datei zu erstellen .Normalerweise benutze ich einen kurzen Einzeiler.
Dies durchläuft die 'dev - *. Php'-Dateien, erhält den neuen Namen ohne' dev- 'und erstellt dann den Symlink.
quelle
Mit würden
zsh
Sie tun:Mit
bash
oder anderen POSIX-Shells (einschließlichzsh
):Beachten Sie, dass, wenn
site.php
vorhanden und ein Verzeichnis (oder ein Symlink zu einem Verzeichnis) ist, möglicherweise eindev-site.php
Symlink darin enthalten ist. Mit GNUln
könnten Sie die Add --T
Option dagegen zu schützen (mitzmv
Einsatz ,-o -T
um die Pass --T
Option bis zuln
).quelle