J'utilise la ls -a
commande 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
ls
vers python,ls
un fichier par ligne sera généré, comme je l'ai expliqué dans ma réponse.ls
une sortie verspython
et observé la sortie d'une seule ligne en python?Réponses:
Utilisez l'
-1
option (notez que c'est un chiffre "un", pas une lettre minuscule "L"), comme ceci:Mais d'abord, assurez-vous que vos
ls
soutiens-1
. GNU coreutils (installé sur les systèmes Linux standard) et Solaris do; mais en cas de doute, utilisezman ls
ouls --help
ou consultez la documentation. Par exemple:la source
ls --help
sortie ... toujours installé ;-)linux ls one file per line
et c'était le meilleur article. Je ne peux pas croire à quel point la réponse choisie est prolixe ou que cette réponse a moins de votes que celle qui catalyse.ls -1
ftw.ls
le-1
comportement par défaut lorsque la sortie n'est pas connectée au terminal.Oui, vous pouvez facilement faire
ls
sortir un nom de fichier par ligne:Explication: La commande
ls
détecte si la sortie est vers un terminal ou vers un fichier ou un canal et s'ajuste en conséquence.Donc, si vous dirigez
ls -a
vers python, cela devrait fonctionner sans aucune mesure spéciale.la source
ls
trouve juste une version allégée qui ne prend donc pas en charge-1
.
et..
" fichiers apparaissent dans la sortie?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 toutesls
les fonctionnalités intégrées. Utilisezos.listdir
pour lister le contenu d'un répertoire etos.stat
ouos
pour obtenir des métadonnées de fichier. D'autres fonctions desos
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:
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
):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.
la source
vous pouvez utiliser
ls -1
ls -l
fera également le travailla source
ls -l
ne devrait pas être utilisée.Facile, tant que vos noms de fichiers n'incluent pas de nouvelles lignes:
Si vous redirigez ceci dans une autre commande, vous devriez probablement préférer séparer vos noms de fichiers par des octets nuls, plutôt que des sauts de ligne, car les octets nuls ne peuvent pas apparaître dans un nom de fichier (mais les sauts de ligne peuvent le faire):
L'impression sur un terminal s'affichera probablement sur une seule ligne, car les octets nuls ne sont normalement pas imprimés. Certains programmes peuvent nécessiter une option spécifique pour gérer les entrées délimitées par des valeurs nulles, telles que
sort
's-z
. De la même manière, votre propre script devrait en tenir compte.la source