讓 ls 將其全部列印在一行上(就像在終端機中一樣)

讓 ls 將其全部列印在一行上(就像在終端機中一樣)

ls根據輸出是到終端還是其他東西,列印結果會有所不同。

例如:

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

有沒有某種方法可以使ls列印輸出在一行上,就好像它不是在終端上一樣。有一種-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)

相關內容