277 votes

Comment puis-je inscrire un nom de fichier par ligne de sortie de Linux?

Je suis à l'aide d' ls -a commande pour obtenir les noms de fichiers dans un répertoire, mais la sortie est en une seule ligne.

Comme ceci:. .. .bash_history .ssh updator_error_log.txt

Est-il intégré dans la variante d'obtenir les noms de fichiers, chacun sur une nouvelle ligne, comme ceci:

.  
..  
.bash_history  
.ssh  
updator_error_log.txt

527voto

Bert F Points 27237

Utiliser man ls pour voir si votre ls prend en charge l' -1 option (que le "un" chiffre, pas une lettre minuscule "L" - merci @slashmais), par exemple

http://docs.oracle.com/cd/E19082-01/819-2239/6n4hsf6oc/index.html

...

-1

   Prints one entry per line of output.

GNU/Linux est ls charge, donc à utiliser:

ls -1a

148voto

Peter G. Points 8566

Oui:

ls -a | cat

Explication: La commande ls sens si la sortie est à un terminal ou à un fichier ou d'un tuyau, et ajuste en conséquence.

32voto

Gilles Points 37537

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 lss'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.

0voto

Ramazan POLAT Points 475

Juste pour le plaisir de la diversité:

ls | tr ' ' '\n'

tr commande traduit tous les espaces dans de nouvelles lignes. Depuis ls sans aucun argument ne donnent que les noms de fichiers séparés par un espace, la sortie est montré comme un nom de fichier par ligne.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X