web-dev-qa-db-fra.com

Comment lister un nom de fichier par ligne de sortie sous Linux?

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

Comme ça:

.  ..  .bash_history  .ssh  updater_error_log.txt

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

.  
..  
.bash_history  
.ssh  
updater_error_log.txt
195
fixxxer

Utilisez l'option -1 (notez qu'il s'agit d'un chiffre "un" et non d'une lettre minuscule "L"), comme ceci:

ls -1a

Tout d’abord, cependant, assurez-vous que votre ls prend en charge -1. GNU coreutils (installé sur les systèmes Linux standard) et Solaris do; 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
372
Bert F

Oui, vous pouvez facilement faire en sorte que ls produise un nom de fichier par ligne:

ls -a | cat

Explication: La commande ls détecte si la sortie est destinée à un terminal, à un fichier ou à un canal et s'ajuste en conséquence.

Donc, si vous dirigez ls -a vers python, cela devrait fonctionner sans mesures spéciales.

122
Peter G.

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 est le moyen le plus simple d'obtenir l'effet souhaité. Étant donné que ls peut modifier les noms de fichier non-ASCII et les caractères de contrôle, ces cas sont un sous-ensemble de ceux pour lesquels il n'est pas nécessaire d'obtenir un nom de fichier auprès de ls.

En python, il n'y a absolument aucune raison d'appeler ls. Python a toutes les fonctionnalités de ls intégrées. Utilisez os.listdir pour répertorier le contenu d'un répertoire et os.stat ou os pour obtenir des métadonnées de fichier. Les autres fonctions des modules os sont également susceptibles de présenter un intérêt pour votre problème.


Si vous accédez à des fichiers distants via ssh, sftp constitue un moyen relativement robuste de lister les noms de fichiers:

_echo ls -1 | sftp remote-site:dir
_

Cela imprime un nom de fichier par ligne et, contrairement à l'utilitaire ls, 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 et non d'un problème de convivialité).

Dans python (sachez que les métacaractères Shell doivent être des échappements dans _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 de traitement par lots de sftp dans la documentation.

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

29
Gilles

vous pouvez utiliser ls -1

ls -l fera également le travail

10
ILF

Facile, tant que vos noms de fichiers n'incluent pas de nouvelles lignes:

find . -maxdepth 1

Si vous utilisez cela dans une autre commande, vous devriez probablement préférer séparer vos noms de fichiers par des octets nuls, plutôt que par des lignes, car les octets nuls ne peuvent pas figurer dans un nom de fichier (mais les nouvelles lignes peuvent):

find . -maxdepth 1 -print0

L'impression sur un terminal sera probablement affichée sur une seule ligne, car aucun octet nul n'est normalement imprimé. Certains programmes peuvent nécessiter une option spécifique pour gérer les entrées délimitées par des valeurs nulles, tels que sort's -z. De la même façon, votre propre script devrait en tenir compte.

1
8bittree