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

8

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

Goku__
источник
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") } }'
NuTTyX
источник
Нашел ошибку, из-за которой iтерялось значение после выполнения цикла, из-за которого сценарий каждый раз отображал все новое на некоторых машинах Linux
NuTTyX
1

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

watch -d dir_name
Goku__
источник
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
kenorb
источник