ls ですべてを 1 行に印刷する (ターミナルのように)

ls ですべてを 1 行に印刷する (ターミナルのように)

ls出力先が端末か他の場所かによって印刷結果が異なります。

例えば:

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

ls実際には端末に出力されていないのに、あたかも端末に出力されているかのように 1 行に出力する方法はありますか。-Cそれを実現するという議論もありますが、複数の行に分割されます。

$ 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

私がこれをやりたい理由は、ディレクトリ内の急速に変化するファイルを監視したいからです。私は次のような簡単なコマンド ラインを作成しました。

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

uniq は、端末に大量の変更が表示されるのを防ぎ、変更のみを表示します。ただし、変更がすべて異なる行に印刷されるため、uniq が役に立たなくなり、ノイズの量が増えます。理論上はwatchこれを使用できますが、ファイルが表示されたり消えたりするとすぐに確認したかったのです。

これが最終的な解決策です:

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

答え1

それができるスイッチは知りませんが、出力をパイプしてtr実行できます。

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

答え2

ls | xargs

これは私にとってはうまくいきました。これまで見つけた中で最も簡単な方法です。これがあなたにも役立つことを願っています。

答え3

このオプションがある場合はls、高い値を使用すると、必要な処理が実行される可能性があります。

ls -w 10000 -C . | head

答え4

ああ、質問を更新したので...

while true ; do echo * ; done | uniq

あなたが投稿した通りのことをしますが、もっとシンプルです。

ただし、これを行うにはinotifyを使用する方がよいでしょう。

inotifywait -m . -e create,delete

inotify がない場合は、次のようなものでもうまく機能します:

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)

関連情報