Cette question a été motivée par des questions sur ls
l' -1
option et la tendance récurrente des gens à poser des questions et des réponses incluant le traitement de la sortie de ls
.
Cette réutilisation de la sortie ls
semble compréhensible, par exemple: si vous savez trier une liste de fichiers avec, ls
vous voudrez peut-être utiliser la sortie de cette manière comme entrée pour autre chose.
Si ces questions-réponses n'incluent pas de référence à la liste de noms de fichiers générée, composée de noms de fichiers au comportement agréable (pas de caractères spéciaux tels que des espaces et des nouvelles lignes), elles sont souvent commentées par quelqu'un soulignant le danger que la séquence de commandes ne fonctionne pas lorsque sont des fichiers avec des nouvelles lignes, des espaces, etc.
find
, sort
Et d' autres services publics résoudre le problème de la communication des noms de fichiers « difficiles » à , par exemple xargs
en utilisant une option pour séparer les noms de fichiers avec le caractère NUL / octet qui n'est pas un caractère valide dans le nom de fichier (le seul en plus /
?) Sur Systèmes de fichiers Unix / Linux.
J'ai consulté la page de manuel ls
et la sortie ls --help
(qui contient plus d'options) et je n'ai pas trouvé que ls
(de coreutils
) dispose d'une option permettant de spécifier une sortie séparée NUL. Il a une -1
option qui peut être interprétée comme "les noms de fichiers de sortie séparés par une nouvelle ligne" )
Q : Y a-t-il une raison technique ou philosophique pour laquelle ls
aucune option --zero
ou -0
option permettant de "sortir les noms de fichiers séparés par NUL"?
Si vous faites quelque chose qui ne sort que les noms de fichiers (sans utiliser par exemple -l
), cela pourrait avoir un sens:
ls -rt -0 | xargs -r0 …
Il se peut que je manque quelque chose pour expliquer pourquoi cela ne fonctionnerait pas, ou existe-t-il une alternative à cet exemple que j'ai oubliée et qui n'est pas beaucoup plus compliquée et / ou obscure .
Addenda:
Faire ls -lrt -0
n'a probablement pas beaucoup de sens, mais de la même manière, ce find . -ls -print0
n'est donc pas une raison pour ne pas fournir une option -0
/ -z
/ --zero
.
la source
ls -rtz
serait certainement utile. Contrastez l'alternative: superuser.com/a/294164/21402Réponses:
MISE À JOUR (2014-02-02)
Merci à notre propre @ Anthon de la détermination à la suite de l'absence de cette fonctionnalité en place , nous avons une raison un peu plus formel pour expliquer pourquoi cette fonctionnalité fait défaut, qui rappelle ce que je l' ai expliqué plus tôt:
Ma réponse originale
C’est un peu mon opinion personnelle, mais j’estime que c’est une décision de conception de laisser ce changement de côté
ls
. Si vous remarquez que lafind
commande a ce commutateur:En laissant ce commutateur inactif, les concepteurs ont laissé entendre que vous ne devriez pas utiliser la
ls
sortie pour autre chose que la consommation humaine. Pour le traitement en aval par d'autres outils, vous devriez plutôt utiliserfind
.Façons d'utiliser find
Si vous recherchez simplement des méthodes alternatives, vous pouvez les trouver ici, intitulé: Le faire correctement: résumé rapide . A partir de ce lien, ce sont probablement les 3 modèles les plus courants:
(extensions communes non standard -print0 et -0. Fonctionne sur GNU, * BSD, busybox)
Une preuve supplémentaire?
J'ai trouvé cet article du blog de Joey Hess intitulé: " ls: les options manquantes ". Un des commentaires intéressants dans ce post:
En outre la recherche J'ai trouvé dans le commettras journaux de l' un des commutateurs supplémentaires que le poste de blog de Joey mentionne, « nouveau format de sortie -j », il semblerait que le billet de blog a été moquait à l'idée de ne jamais ajouter un
-z
interrupteur àls
.Les références
la source
-0
soit mis en œuvre) dans ma question, afin de ne pas égarer les gens.ls -1 | tr '\012' '\000'
liste des fichiers sera séparée par des caractères NULL.Comme les réponses de @ slm vont dans les origines et les raisons possibles, je ne répéterai pas cela ici. Une telle option ne figure pas sur la liste des fonctionnalités rejetées par coreutils , mais le correctif ci - dessous est maintenant rejeté par Pádraig Brady après l’avoir envoyé sur la liste de diffusion coreutils. La réponse indique clairement qu'il s'agit d'une raison philosophique (le
ls
résultat est destiné à la consommation humaine).Si vous voulez essayer si une telle option est raisonnable pour vous, faites:
puis appliquez le correctif suivant contre commit b938b6e289ef78815935ffa705673a6a8b2ee98e dd 2014-01-29:
Après une autre marque, vous pouvez le tester avec:
Le correctif fonctionne donc et je ne vois pas pourquoi il ne fonctionnerait pas, mais ce n’est pas la preuve qu’il n’ya aucune raison technique de laisser de côté cette option.
ls -R0
n’a peut-être pas beaucoup de sens, mais cels -Rm
qui nels
peut pas le faire en dehors de la boîte.la source
-z
et--zero
est plus en ligne avec le genre (également en coreutils.