Есть ли встроенная команда Linux для отображения содержимого каталога в режиме реального времени?
8
Есть ли встроенная команда Linux для отображения содержимого каталога в режиме реального времени? Подобно команде tail -f file_name, которая отображает содержимое файла в режиме реального времени.
Если вы хотите видеть новые файлы более четко, используйте 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
watch -n1 ls
inotifytools
пакет используетinotify
функцию Linux, позволяющую наблюдать за событиями создания файлов, когда они происходят.Ответы:
Вы можете сделать это, используя
watch
. Это не совсем в режиме реального времени, но достаточно близко (до десятой доли секунды):из руководства:
источник
ls -lt
для просмотра новых файлов вверху списка илиls -ltr
для просмотра новых файлов внизу. Затем, чтобы выделить эти новые файлы, используйте,watch -d
чтобы выделить изменения в последнем обновлении илиwatch --differences=cumulative
выделить все изменения с моментаwatch
его запуска.watch tail ls
илиwatch head ls
покажет последние файлы с правильными параметрами упорядочения ls , например -lt с головой или -ltr с хвостом .watch {options} 'ls {options} | tail {options}'
tail -f
изменения в файле. Ваша первоначальная команда былаwatch
не очень хорошей. Я думаю, что будет, если команда, которую это выполняет, обработана соответственно. Иногда вам приходится использоватьsh -c
более сложную команду. Я кратко посмотрел на inotify-tools и не увидел команду, которая показывала бы изменения в каталоге, а не только события, примененные к каталогу.Я написал это, надеюсь, это то, что вам нужно. Это не так
built-in Linux command
, но он использует только распространенные программы, присутствующие в большинстве блоков UNIX.Отрегулируйте
sleep
время по мере необходимости. Я бы использовал значение не менее 2 секунд. Используйтеcmd="ls"
для нерекурсивной структуры илиcmd="find DIRNAME"
для рекурсивного поиска. Обратите внимание, что в последнем случае вы получитеDIRNAME/
префикс для всех файлов и каталогов.источник
i
терялось значение после выполнения цикла, из-за которого сценарий каждый раз отображал все новое на некоторых машинах LinuxЭто так просто после того, как я это знаю.
источник
Вы можете использовать
inotifytools
и его утилиты командной строки.Вы можете использовать
inotify
для мониторинга каталога, и он будет возвращать события для самого каталога и для файлов внутри каталога.Еще один инструмент, который можно использовать
inotifywatch
:Вы можете добавить
-r
для просмотра всех подкаталогов рекурсивно. Однако это решение не обнаруживает изменения во вновь создаваемых файлах .Таким образом, другое решение заключается в использовании
inotifywait
:Вот еще один пример показа содержимого всех вновь созданных
test*
файлов в/tmp
:источник