GNU/Linux >> Tutoriales Linux >  >> Linux

`os.enlace simbólico` frente a `ln -s`

os.symlink crea un solo enlace simbólico.

ln -s crea múltiples enlaces simbólicos (si su último argumento es un directorio y hay más de una fuente). El equivalente de Python es algo como:

dst = args[-1]
for src in args[:-1]:
    os.symlink(src, os.path.join(dst, os.path.dirname(src)))

Entonces, ¿cómo funciona cuando haces ln -s /home/guest/dir1/* /home/guest/dir2/ ? Tu caparazón hace que eso funcione, convirtiendo el comodín en múltiples argumentos. Si tuvieras que exec el ln comando con un comodín, buscaría una sola fuente llamada literalmente * en /home/guest/dir1/ , no todos los archivos en ese directorio.

El equivalente de Python es algo así como (si no le importa mezclar dos niveles e ignorar muchos otros casos:tildes, variables env, sustitución de comandos, etc. que son posibles en el shell):

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)))

No puedes hacer eso con os.symlink solo, ya sea como parte de él, porque no hace eso. Es como decir "Quiero hacer el equivalente a find . -name foo usando os.walk sin filtrar el nombre". O, para el caso, quiero hacer el equivalente a ln -s /home/guest/dir1/* /home/guest/dir2/ sin que el caparazón se englobe para mí".

La respuesta correcta es usar glob o fnmatch o os.listdir más una expresión regular, o lo que prefieras.

no usa os.walk , porque eso hace un recursivo caminata del sistema de archivos, por lo que ni siquiera está cerca del shell * expansión.


* es un patrón de extensión de shell, que en su caso designa "todos los archivos que comienzan con /home/guest/dir1/ ".

Pero es el rol de tu shell expandir este patrón a los archivos con los que coincide. No el ln de comando.

Pero os.symlink no es un shell, es una llamada del sistema operativo; por lo tanto, no admite patrones de extensión de shell. Tendrás que hacer ese trabajo en tu guión.

Para hacerlo, puede usar os.walk o os.listdir . Como se indica en la otra respuesta, la llamada adecuada dependerá de lo que quieras hacer. (os.walk no sería el equivalente de * )

Para convencerse:ejecute este comando en una máquina Unix en su terminal:python -c "import sys; print sys.argv" * . Verás que es el caparazón el que hace el emparejamiento.


Linux
  1. ¿Tiempo de espera agotado en un script de Shell?

  2. ¿En qué shell me estoy ejecutando?

  3. ¿Matrices asociativas en scripts de Shell?

  4. ¿Bloqueo correcto en scripts de Shell?

  5. Shell script directorio actual?

Construcción de comandos

¿Qué es Login Shell en Linux?

Tutorial paso a paso de secuencias de comandos de Shell

Matrices en scripts de Shell

8 tipos de shells de Linux

¿Qué es un archivo .sh?