Ls est destinée à la consommation humaine, et vous ne devriez pas analyser sa sortie.
Dans les scripts shell, il y a quelques cas où l'analyse de la sortie de ls n'travail est le moyen le plus simple d'atteindre l'effet désiré. Depuis ls pourrait mangle non-ASCII les caractères de contrôle et dans les noms de fichiers, ces cas sont un sous-ensemble de celles qui ne nécessitent pas l'obtention d'un nom de fichier à partir d' ls
.
En python, il n'y a absolument aucune raison d'invoquer ls
. Python a tous ls
s'fonctionnalité intégrée. Utiliser os.listdir
à la liste le contenu d'un répertoire et d' os.stat
ou os
pour obtenir les métadonnées du fichier. D'autres fonctions dans l' os
modules sont susceptibles d'être pertinents pour votre problème ainsi.
Si vous êtes accédant à des fichiers distants via ssh, raisonnablement robuste de la liste des noms de fichiers est par sftp:
echo ls -1 | sftp remote-site:dir
Il imprime un nom de fichier par ligne, et à la différence de l' ls
utilitaire, sftp
ne pas coder les caractères non imprimables. Vous ne seront toujours pas en mesure fiable de la liste des répertoires où un nom de fichier contient un saut de ligne, mais c'est rarement le cas (rappelez-vous ceci comme un problème potentiel de sécurité, pas un problème de convivialité).
En python (attention, shell métacaractères doit être échappe en remote_dir
):
command_line = "echo ls -1 | sftp " + remote_site + ":" + remote_dir
remote_files = os.popen(command_line).read().split("\n")
Pour plus d'interactions complexes, de rechercher sftp du mode batch dans la documentation.
Sur certains systèmes (Linux, Mac OS X, peut-être quelques autres unix, mais certainement pas de Windows), une approche différente est de monter un système de fichiers distant via ssh avec sshfs, et ensuite travailler localement.