Ls est conçu pour la consommation humaine et vous ne devez pas analyser sa sortie .
Dans les scripts shell, il existe quelques cas où l'analyse de la sortie de ls fonctionne est le moyen le plus simple d'obtenir l'effet souhaité. Étant donné que ls peut modifier les caractères non ASCII et contrôler les noms de fichiers, ces cas sont un sous-ensemble de ceux qui ne nécessitent pas l'obtention d'un nom de fichier ls
.
En python, il n'y a absolument aucune raison d'invoquer ls
. Python a toutes ls
les fonctionnalités intégrées. Utilisez os.listdir
pour lister le contenu d'un répertoire et os.stat
ou os
pour obtenir des métadonnées de fichier. D'autres fonctions des os
modules sont également susceptibles d'être pertinentes pour votre problème.
Si vous accédez à des fichiers distants via ssh, un moyen raisonnablement robuste de répertorier les noms de fichiers est via sftp:
echo ls -1 | sftp remote-site:dir
Cela imprime un nom de fichier par ligne et, contrairement à l' ls
utilitaire, sftp
ne modifie pas les caractères non imprimables. Vous ne pourrez toujours pas répertorier de manière fiable les répertoires dans lesquels un nom de fichier contient une nouvelle ligne, mais cela est rarement fait (rappelez-vous qu'il s'agit d'un problème de sécurité potentiel, pas d'un problème d'utilisation).
En python (attention aux métacaractères shell doivent être des échappements remote_dir
):
command_line = "echo ls -1 | sftp " + remote_site + ":" + remote_dir
remote_files = os.popen(command_line).read().split("\n")
Pour des interactions plus complexes, recherchez le mode batch de sftp dans la documentation.
Sur certains systèmes (Linux, Mac OS X, peut-être d'autres unités, mais certainement pas Windows), une approche différente consiste à monter un système de fichiers distant via ssh avec sshfs , puis à travailler localement.