Question

J'utilise commande ls -a pour obtenir les noms de fichiers dans un répertoire, mais la sortie est en une seule ligne.

Comme ceci:

.  ..  .bash_history  .ssh  updater_error_log.txt

J'ai besoin intégré également possible d'obtenir les noms de fichiers, chacun sur une nouvelle ligne, comme ceci:

.  
..  
.bash_history  
.ssh  
updater_error_log.txt
Était-ce utile?

La solution

Utilisez l'option -1 (noter que ceci est un chiffre "un", pas une lettre minuscule "L"), comme ceci:

ls -1a

Mais d'abord, assurez-vous que votre ls supports -1. GNU coreutils (installés sur les systèmes Linux standard) et Solaris font; mais en cas de doute, utilisez man ls ou ls --help ou consultez la documentation. Par exemple:.

$ man ls
...
       -1     list one file per line.  Avoid '\n' with -q or -b

Autres conseils

Oui, vous pouvez facilement faire sortie ls un nom de fichier par ligne:

ls -a | cat

Explication:. Les sens de ls de commande si la sortie est à un terminal ou à un fichier ou un tube et ajuste en conséquence

Donc, si vous redirigez ls -a à python il devrait fonctionner sans mesures spéciales.

Ls est conçu pour 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 ne fonctionne est la façon la plus simple d'obtenir l'effet désiré. Étant donné que ls peuvent mangle 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 ls.

En python, il n'y a absolument aucune raison d'invoquer ls. Python a toutes les fonctionnalités de ls intégré. Utilisez os.listdir pour afficher le contenu d'un répertoire et os.stat ou os pour obtenir des métadonnées de fichiers. D'autres fonctions dans le os modules sont susceptibles d'être pertinents à votre problème ainsi.


Si vous accédez à des fichiers distants via ssh, d'une manière assez robuste de la liste des noms de fichiers est par sftp:

echo ls -1 | sftp remote-site:dir

affiche un nom de fichier par ligne, et contrairement à l'utilitaire ls, sftp ne mangle caractères non imprimables. Vous ne serez pas toujours en mesure de répertoires de liste fiable où un nom de fichier contient un saut de ligne, mais ce qui est fait rarement (rappelez-vous cela comme un problème de sécurité potentiel, pas un problème de la facilité d'utilisation).

python (attention à ce que les métacaractères du shell doit être échappe à 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, rechercher le mode de traitement par lots de sftp dans la documentation.

Sur certains systèmes (Linux, Mac OS X, peut-être quelques autres systèmes Unix, mais certainement pas Windows), une approche différente est de monter un système de fichiers distant via ssh avec sshfs , puis travailler localement.

vous pouvez utiliser ls -1

ls -l également faire le travail

facile, aussi longtemps que vos noms ne comprennent pas les nouvelles lignes:

find . -maxdepth 1

Si vous êtes dans une autre tuyauterie cette commande, vous devez sans doute préférer séparer vos noms de fichiers par des octets nuls, plutôt que des sauts de ligne, car octets nuls ne peuvent pas se produire dans un nom de fichier (mais peut sauts de ligne):

find . -maxdepth 1 -print0

L'impression que sur un terminal affichera probablement une ligne, car octets nuls ne sont pas normalement imprimés. Certains programmes peuvent avoir besoin d'une option spécifique à la poignée d'entrée nulle délimité, comme le sort de -z. Votre propre script serait de la même nécessité de tenir compte pour cela.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top