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


ls imprime différemment selon que la sortie est destinée à un terminal ou à autre chose.

par exemple.:

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

Y a-t-il un moyen de faire ls imprimer sur une ligne comme si c'était à un terminal alors que ce n'est pas le cas. Il y a un -C Cet argument est le même, mais il sera divisé 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 faire cela est que je veux surveiller les fichiers d'un répertoire qui changeaient 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 tout cela sur différentes lignes, ce qui rendait l’uniq inutile et augmentait le bruit. En théorie, on pourrait utiliser watch pour cela, mais je voulais voir un fichier dès son apparition / disparition.

C'est la solution finale:

while [[ true ]] ; do ls | tr '\n' ' ' ; done | uniq

7
2018-01-24 15:37


origine


si vous dirigez 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:


Je ne connais pas d'interrupteur capable de le faire, mais vous pouvez diriger votre sortie vers tr pour le faire:

ls | tr "\n" " " | <whatever you like>

13
2018-01-24 15:48





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 aide aussi.


6
2017-10-31 06:52





Si ton ls a cette option, vous pouvez utiliser une valeur élevée et il peut faire ce que vous voulez:

ls -w 10000 -C . | head

4
2018-01-24 15:49





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

while true ; do echo * ; done | uniq

fera ce que vous avez posté, simplement.

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

inotifywait -m . -e create,delete

si vous n'avez pas inotify, alors quelque chose comme ceci 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)

3
2018-01-28 04:38





Qu'en est-il du très trivial

echo *

? :-) Vous n'avez même pas besoin de payer pour cela. :-)


2
2018-01-27 23:15





C'est peut-être ce que vous cherchez, mais j'ai peut-être mal compris votre question, mais voilà.

Quelques commandes à explorer:

watch - exécute un programme périodiquement, en affichant la sortie en plein écran xargs - construit et exécute des lignes de commande à partir d'une 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 modifiés avec un intervalle de 2 secondes (valeur par défaut pour la surveillance).

regarder "ls -lart | tail -10"

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

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

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

ou juste pour les afficher:

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


0
2018-01-28 04:49





Vous pouvez utiliser des ticks arrière dans le shell pour réaliser ceci comme:

echo -E `ls -1`

0
2018-01-27 22:27



Ne fonctionne pas avec tous les noms de fichiers. Essayer: touch ./-en - kasperd
Cela n’a d’importance que si vous n’avez pas de fichiers commençant par [a-d] ce genre avant lui. Si vous l'exécutez dans un script echo -E ne serait pas trop gênant et la nouvelle ligne de fuite ne importerait peut-être pas. - chicks