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)