让 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)

相关内容