Oui, vous pouvez facilement créer ls
afficher un nom de fichier par ligne :
ls -a | cat
Explication :La commande ls
détecte si la sortie est vers un terminal ou vers un fichier ou un tube et s'ajuste en conséquence.
Donc, si vous pipez ls -a
en python cela devrait fonctionner sans aucune mesure particulière.
vous pouvez utiliser ls -1
ls -l
fera également le travail
Utilisez le -1
option (notez qu'il s'agit d'un chiffre "un", pas d'une lettre minuscule "L"), comme ceci :
ls -1a
Mais d'abord, assurez-vous que votre ls
supporte -1
. GNU coreutils (installé sur les systèmes Linux standard) et Solaris le font ; mais en cas de doute, utilisez man ls
ou ls --help
ou consultez la documentation. Ex. :
$ man ls
...
-1 list one file per line. Avoid '\n' with -q or -b
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 mutiler les caractères non ASCII et de contrôle dans les noms de fichiers, ces cas sont un sous-ensemble de ceux qui ne nécessitent pas l'obtention d'un nom de fichier à partir de ls
.
En python, il n'y a absolument aucune raison d'invoquer ls
. Python a tout de ls
la fonctionnalité intégrée. Utilisez os.listdir
pour lister le contenu d'un répertoire et os.stat
ou os
pour obtenir les métadonnées du fichier. Autres fonctions dans le os
modules sont susceptibles d'être également pertinents pour votre problème.
Si vous accédez à des fichiers distants via ssh, un moyen raisonnablement robuste de répertorier les noms de fichiers consiste à utiliser sftp :
echo ls -1 | sftp remote-site:dir
Cela imprime un nom de fichier par ligne, et contrairement au 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 où 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 et non d'un problème d'utilisation).
En python (attention, les métacaractères du shell doivent être des échappements en 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 unix, mais certainement pas Windows), une approche différente consiste à monter un système de fichiers distant via ssh avec sshfs, puis à travailler localement.