хвостообразный непрерывный ls (список файлов)

Я отслеживаю новые файлы, созданные в папке в Linux. Время от времени я выдаю в нем «ls -ltr». Но хотелось бы, чтобы была программа/скрипт, который автоматически печатал бы его, и только последние записи. Я сделал короткий цикл while, чтобы перечислить его, но он повторял записи, которые не были новыми, и мой экран продолжал сворачиваться, когда не было новых файлов. Я узнал о «часах», которые показывают, что я хочу, и обновляются каждые N секунд, но мне не нужен интерфейс ncurses, я ищу что-то вроде хвоста:

  • непрерывный
  • показывает только новое
  • печатает в моем терминале, поэтому я могу запускать его в фоновом режиме и делать другие вещи и время от времени видеть вывод, который смешивается с тем, что я делаю: D

Подведение итогов: получить ввод, сравнить с предыдущим вводом, вывести только то, что является новым. Что-то, что делает это, не похоже на такой странный инструмент, я вижу, что он используется и в других ситуациях, поэтому я ожидал, что он уже существует, но я ничего не смог найти. Предложения?


person msb    schedule 05.09.2013    source источник
comment
Какой у вас дистрибутив?   -  person Sean Bright    schedule 06.09.2013
comment
возможный дубликат Как постоянно отслеживать каталог с помощью dnotify/ команда inotify   -  person sehe    schedule 06.09.2013
comment
У меня перечная мята. Я изучаю «inotify», я никогда о нем не слышал, по-видимому, он не делает то, что я хочу, просто, возможно, помогает мне запрограммировать скрипт для этого.   -  person msb    schedule 06.09.2013
comment
@msb, безусловно, будет, посмотрите на второй ответ (с малым количеством голосов). Он работает «из коробки» на моем компьютере с Ubuntu (sudo apt-get install inotify-tools)   -  person sehe    schedule 06.09.2013


Ответы (3)


Если у вас есть доступ к inotifywait (доступен в пакете inotify-tools, если вы используете Debian/Ubuntu), вы можете написать такой скрипт:

#!/bin/bash

WATCH=/tmp

inotifywait -q -m -e create --format %f $WATCH | while read event
do
    ls -ltr $WATCH/$event
done

Это однострочник, который не даст вам ту же информацию, что и ls, но выведет имя файла:

inotifywait -q -m -e create --format %w%f /some/directory
person Sean Bright    schedule 05.09.2013
comment
Спасибо, это сработало. Я сделал это скриптом и получаю $WATCH в качестве параметра. Спасибо! - person msb; 06.09.2013
comment
В качестве дополнительного комментария сценарий перечисляет все новые файлы, но размер файла обычно равен нулю, и это потому, что ls выполняется после создания файла, но до добавления его содержимого. Я добавил usleep перед ls, и теперь все идеально. :-) Можете ли вы (или я) добавить это к вашему ответу? - person msb; 06.09.2013
comment
Исправит ли это изменение -e create на -e close_write? - person Sean Bright; 06.09.2013
comment
:о да это так! удивительная эта вещь inotify, я обязательно узнаю об этом больше. еще раз спасибо. :) - person msb; 06.09.2013

Вы можете использовать очень удобную команду watch

watch -n 10 "ls -ltr"

И вы будете получать ls каждые 10 секунд.

И если вы добавите tail -10, вы получите только 10 самых новых.

watch -n 10 "ls -ltr|tail -10" 
person opentokix    schedule 05.09.2013
comment
Это позволит пропустить файлы, в которых создатель изменяет время файла на 0 вскоре после создания. - person ott--; 06.09.2013
comment
как упоминалось в моем первоначальном вопросе, часы - это не совсем то, что мне нужно, поскольку они будут повторять последние файлы, если новых файлов недостаточно, И у них есть интерфейс ncurses. :-/ - person msb; 06.09.2013
comment
Ой, извините - я пропустил ваше упоминание о проклятиях в моем волнении, чтобы ответить. Я часто пользуюсь часами. - person opentokix; 06.09.2013

Это работает в cygwin и Linux. Некоторые из предыдущих решений, которые записывают файл, вызывают перегрузку диска.

Этот скрипт не имеет этой проблемы:

SIG=1
SIG0=SIG
while [ $SIG != 0 ] ; do
 while [ $SIG = $SIG0 ] ; do
   SIG=`ls -1 | md5sum | cut -c1-32`
   sleep 10
 done
 SIG0=$SIG
 ls -lrt | tail -n 1
done
person user1186515    schedule 17.11.2016