Есть ли встроенная команда Linux для отображения содержимого каталога в режиме реального времени?


8

Есть ли встроенная команда Linux для отображения содержимого каталога в режиме реального времени? Подобно команде tail -f file_name, которая отображает содержимое файла в режиме реального времени.


4
Как насчетwatch -n1 ls
Джо

Посмотрите на часы ( linfo.org/watch.html )
Дэвид Сегондс

4
Не совсем встроенный, но inotifytoolsпакет использует inotifyфункцию Linux, позволяющую наблюдать за событиями создания файлов, когда они происходят.
chepner

Ответы:


6

Вы можете сделать это, используя watch. Это не совсем в режиме реального времени, но достаточно близко (до десятой доли секунды):

watch -n0.1 ls

из руководства:

-n, --interval seconds
          Specify update interval.  The command will not allow quicker than 0.1 second interval, in which the smaller values are converted.

1
Если вы хотите видеть новые файлы более четко, используйте ls -ltдля просмотра новых файлов вверху списка или ls -ltrдля просмотра новых файлов внизу. Затем, чтобы выделить эти новые файлы, используйте, watch -dчтобы выделить изменения в последнем обновлении или watch --differences=cumulativeвыделить все изменения с момента watchего запуска.
garyjohn

@ jm666 - watch tail lsили watch head lsпокажет последние файлы с правильными параметрами упорядочения ls , например -lt с головой или -ltr с хвостом .
AFH

@ jm666 - Конечно, это чепуха, если понимать ее буквально: я использовал это как сокращение дляwatch {options} 'ls {options} | tail {options}'
AFH

@ jm666: Запрос был о команде, которая следует за изменениями в каталоге, как tail -fизменения в файле. Ваша первоначальная команда была watchне очень хорошей. Я думаю, что будет, если команда, которую это выполняет, обработана соответственно. Иногда вам приходится использовать sh -cболее сложную команду. Я кратко посмотрел на inotify-tools и не увидел команду, которая показывала бы изменения в каталоге, а не только события, примененные к каталогу.
garyjohn

2

Я написал это, надеюсь, это то, что вам нужно. Это не так built-in Linux command, но он использует только распространенные программы, присутствующие в большинстве блоков UNIX.

Отрегулируйте sleepвремя по мере необходимости. Я бы использовал значение не менее 2 секунд. Используйте cmd="ls"для нерекурсивной структуры или cmd="find DIRNAME"для рекурсивного поиска. Обратите внимание, что в последнем случае вы получите DIRNAME/префикс для всех файлов и каталогов.

 echo "" | awk '{while ( 1 ) {cmd="find ."; delete b;c=0; while ( ( cmd | getline result ) > 0 ) {test=1;c++;n=0;for (i in a) {n++;if (a[i]==result) {b[c]=i; test=0; break;}} if (test) {n++;a[n]=result;b[c]=n;print "##NEW## "result }} close (cmd); for (i in a) {test=1;for (j in b) {if (b[j]==i) {test=0;break}} if (test) {print "##DELETED## "a[i]; delete a[i]}} system("sleep 5") } }'

Нашел ошибку, из-за которой iтерялось значение после выполнения цикла, из-за которого сценарий каждый раз отображал все новое на некоторых машинах Linux
NuTTyX

1

Это так просто после того, как я это знаю.

watch -d dir_name

0

Вы можете использовать inotifytoolsи его утилиты командной строки.

Вы можете использовать inotifyдля мониторинга каталога, и он будет возвращать события для самого каталога и для файлов внутри каталога.

Еще один инструмент, который можно использовать inotifywatch:

sudo inotifywatch -v -r /foo

Вы можете добавить -rдля просмотра всех подкаталогов рекурсивно. Однако это решение не обнаруживает изменения во вновь создаваемых файлах .

Таким образом, другое решение заключается в использовании inotifywait:

inotifywait -m --format "%f" /foo

Вот еще один пример показа содержимого всех вновь созданных test*файлов в /tmp:

inotifywait -m --format "%f" /tmp | grep --line-buffered ^test | xargs -L1 -I% sudo cat /tmp/% 2> /dev/null
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.