os.symlink
erstellt einen einzelnen Symlink.
ln -s
erstellt mehrere symbolische Verknüpfungen (wenn das letzte Argument ein Verzeichnis ist und mehrere Quellen vorhanden sind). Das Python-Äquivalent ist so etwas wie:
dst = args[-1]
for src in args[:-1]:
os.symlink(src, os.path.join(dst, os.path.dirname(src)))
Also, wie funktioniert es, wenn Sie ln -s /home/guest/dir1/* /home/guest/dir2/
tun? Ihre Shell macht das, indem Sie den Platzhalter in mehrere Argumente verwandeln. Wenn Sie nur exec
der ln
Befehl mit einem Platzhalter wären, würde es nach einer einzelnen Quelle mit dem tatsächlichen Namen *
in /home/guest/dir1/
suchen, nicht alle Dateien in diesem Verzeichnis.
Das Python-Äquivalent ist so etwas wie (wenn Sie nichts dagegen haben zwei Ebenen miteinander zu vermischen und eine Menge anderer Fälle-Tilden ignorieren, env Variablen, Kommandosubstitution usw., die an der Schale sind möglich):
dst = args[-1]
for srcglob in args[:-1]:
for src in glob.glob(srcglob):
os.symlink(src, os.path.join(dst, os.path.dirname(src)))
Sie können das nicht mit os.symlink
allein tun - entweder ein Teil davon - weil es das nicht tut. Es ist so, als würde ich sagen: "Ich möchte das Äquivalent von find . -name foo
mit os.walk
machen, ohne den Namen zu filtern." Oder, in der Tat, ich möchte das Äquivalent von ln -s /home/guest/dir1/* /home/guest/dir2/
ohne die Shell Globbing für mich tun."
Die richtige Antwort ist glob
zu verwenden, oder fnmatch
oder os.listdir
sowie eine regex, oder was auch immer Sie bevorzugen.
Sie nicht Verwendung os.walk
, denn das ist ein rekursive Dateisystem tut zu Fuß, so dass es nicht einmal in der Nähe *
Expansion zu schälen.
Ich denke, * * 'os.symlink' eine bloße Umhüllung des jeweiligen Systemaufruf ist (na ja, mehr oder weniger) und damit die gleiche Semantik nicht bieten würde man von einem Voll bekommen flügge Dienstprogramm mit diesem Systemaufruf. – 0xC0000022L
Was ist der Grund für die Anforderung "Ich möchte dies mithilfe von' os.symlink "tun? Wenn es richtig ist, eine 'for'-Schleife über einen' glob' zu machen, warum willst du dann nicht das Richtige tun? – abarnert
@abarnert Ich werde das tun, wenn ich muss. Ich wollte wissen, ob es einen Weg gibt, es mit 'os.symlink' zu machen. Ich dachte, es würde alles liefern, was "ln -s" tut, aber es stellt sich heraus, dass es nicht so ist. – jurgenreza