Faire imprimer ls tout sur une seule ligne (comme dans le terminal)

14

ls s'imprime différemment selon que la sortie est vers un terminal ou vers autre chose.

par exemple:

$ ls .
file1  file2
$ ls . | head
file1
file2

Existe-t-il un moyen d' lsimprimer sur une seule ligne comme s'il s'agissait d'un terminal alors qu'il ne l'est pas? Il y a un -Cargument selon lequel sorta fait cela, mais il le divisera en plusieurs lignes.

$ ls
file1  file10  file11  file12  file13  file14  file15  file16  file17  file18  file19 file2  file3  file4  file5  file6  file7  file8  file9
$ ls -C . | head
file1 file11 file13 file15 file17 file19 file3  file5  file7  file9
file10 file12 file14 file16 file18 file2 file4  file6  file8

La raison pour laquelle je veux le faire est que je veux surveiller les fichiers dans un répertoire qui changeait rapidement. J'avais construit cette simple ligne de commande:

while [[ true ]] ; do ls ; done | uniq

L'uniq l'empêche de spammer mon terminal et d'afficher uniquement les modifications. Cependant, il imprimait le tout sur des lignes différentes, ce qui rendait l'uniq inutile et augmentait la quantité de bruit. En théorie, on pourrait l'utiliser watchpour cela, mais je voulais voir un fichier dès qu'il est apparu / disparu.

Voici la solution finale:

while [[ true ]] ; do ls | tr '\n' ' ' ; done | uniq
Rory
la source
4
si vous redirigez ls vers une autre commande, vous faites quelque chose de mal. Qu'essayez-vous réellement d'accomplir?
Justin
Justin, j'ai mis à jour la question avec une explication.
Rory

Réponses:

16

je ne connais pas de commutateur qui pourrait faire cela, mais vous pouvez diriger votre sortie trpour le faire:

ls | tr "\n" " " | <whatever you like>
Christian
la source
16
ls | xargs

Cela fonctionne pour moi, c'est la manière la plus simple que j'ai jamais trouvée. J'espère que cela vous aidera aussi.

Jian Weihang
la source
4

Si vous avez lscette option, vous pouvez utiliser une valeur élevée et elle pourrait faire ce que vous voulez:

ls -w 10000 -C . | head
En pause jusqu'à nouvel ordre.
la source
4

ah, maintenant que vous avez mis à jour la question ....

while true ; do echo * ; done | uniq

fera ce que vous avez posté, simplement plus simple.

cependant, il vaut mieux utiliser quelque chose qui utilise inotify pour ce faire .. comme

inotifywait -m . -e create,delete

si vous n'avez pas d'inotify, alors quelque chose comme ça fonctionne bien aussi:

import os
import time

last = set()
while True:
    cur = set(os.listdir('.'))
    added = cur-last
    removed = last-cur
    if added: print 'added', added
    if removed: print 'removed', removed
    last = set(os.listdir('.'))
    time.sleep(0.1)
Justin
la source
3

Qu'en est-il du tout trivial

echo *

? :-) Vous n'avez même pas besoin de le bifurquer. :-)

peterh - Réintégrer Monica
la source
0

C'est peut-être ce que vous cherchez, mais j'ai peut-être mal compris votre question, mais voici :)

Quelques commandes qui méritent d'être examinées:

watch - exécuter un programme périodiquement, montrant les xargs en plein écran de sortie - construire et exécuter des lignes de commande à partir de l'entrée standard (-0 si vous voulez gérer des fichiers avec des espaces, etc.)

Vous pouvez faire quelque chose comme ce qui suit pour afficher les 10 derniers fichiers / répertoires qui ont changé avec un intervalle de 2 secondes (par défaut pour la montre)

montre "ls -lart | tail -10"

les options -lart indiquent à ls d'être détaillé et de trier en fonction de l'heure de modification.

Si vous voulez vraiment juste les fichiers, je ferais juste quelque chose comme:

regarder "ls -lart | awk '{print \ $ 8}' | tail -10 | xargs"

ou juste pour les afficher:

ls -lart | awk '{print $ 8}' | queue -10 | xargs

ScottZ
la source
0

Vous pouvez utiliser des tiques inversées dans le shell pour y parvenir comme:

echo -E `ls -1`
poussins
la source
Ne fonctionne pas avec tous les noms de fichiers. Essayez:touch ./-en
kasperd
Cela n'a d'importance que si vous n'avez aucun fichier commençant par [a-d]ce type avant. Si vous l'exécutez dans un script, echo -Ece ne serait pas trop gênant et le retour à la ligne pourrait ne pas avoir d'importance.
poussins
0

Cela a fonctionné pour moi car j'avais besoin non seulement d'imprimer le résultat sur une seule ligne, mais aussi de spécifier comment il devait être séparé et vous pouvez le spécifier avec ORS

ls -1 | awk '{ ORS="|"; print; }'
mavi
la source