Сценарий оболочки для подсчета количества вставленных и удаленных файлов за 1 секунду

Мне нужно написать скрипт, который будет подсчитывать количество файлов в каталоге каждую 1 секунду.

for item in /d:/new_dir/*
do
if [ -f $item ]
then
     FILECOUNT=$[$FILECOUNT+1]
fi
done
     echo -e "No of files are $FILECOUNT\r\c";
FILECOUNT=0
sleep 1s
done

Но я хочу посмотреть, какие файлы были добавлены или удалены между двумя итерациями. Скажите, пожалуйста, какую модификацию мне нужно изменить в приведенном выше коде.


person abc    schedule 19.09.2013    source источник
comment
Язык указан? sh, bash, perl?   -  person SzG    schedule 19.09.2013
comment
То же самое вопрос перефразирован три способы?   -  person beroe    schedule 25.09.2013


Ответы (3)


Этот простой скрипт должен работать для вас, используя внутренние массивы bash:

a1=( * )
while :; do
   echo "Num of files at present => " ${#a1[@]}
   if [[ $a2 && ${#a1[@]} != ${#a2[@]} ]]; then
      [[ ${#a2[@]} > ${#a1[@]} ]] && echo "new files added =>" && \
                      grep -v -f <(printf "%s\n" "${a1[@]}") <(printf "%s\n" "${a2[@]}")
      [[ ${#a1[@]} > ${#a2[@]} ]] && echo "existing files deleted =>" && \
                      grep -v -f <(printf "%s\n" "${a2[@]}") <(printf "%s\n" "${a1[@]}")
      a1=( * )
   fi
   sleep 5
   a2=( * )
done
person anubhava    schedule 19.09.2013
comment
Пожалуйста, объясните мне значение $, @, # и a1[@] в сценарии оболочки - person abc; 25.09.2013
comment
@ArchnaSharma: я могу ответить на любой конкретный вопрос о скрипте. Здесь я использую массивы bash. Пожалуйста, прочитайте простой учебник по массивам bash, а затем дайте мне знать ваши вопросы. Вы можете прочитать: thegeekstuff.com/2010/06/bash-array-tutorial - person anubhava; 25.09.2013

Я использую ls для вывода списка каталогов, wc для подсчета, diff для отображения добавленных/удаленных файлов, sed для фильтрации каталогов/символических ссылок и метаданных различий, а также подстановку процесса bash <(), чтобы обмануть diff, заставив его думать, что он сравнивает 2 файла, сравнивая только 2 переменные.

#!/bin/bash
dir=$1
old=`ls -1F $dir | sed '/[\/@]$/d'`
while true; do
  new=`ls -1F $dir | sed '/[\/@]$/d'`
  echo "$new" | wc -l | sed 's/^/No of files is /'
  diff -u <(echo "$old") <(echo "$new") | sed -r '/^((\+\+)|(--)|(@@)| )/d'
  old=$new
  sleep 1
done

Добавленные файлы будут отображаться как +foo, удаленные — как -foo.

Если вы работаете на Mac или другой системе Unix, отличной от GNU, фильтр метаданных различий выглядит следующим образом:

sed '/^\(\(++\)|\(--\)|\(@@\)| \)$/d'

Некрасиво, да?

person SzG    schedule 19.09.2013
comment
Я не знал о <(). Узнавайте что-то новое каждый день. - person slebetman; 19.09.2013
comment
Я тоже сегодня научился. Погуглил diff 2 bash переменные и, боже, я нашел страницу stackoverflow о ‹()! :-) - person SzG; 19.09.2013
comment
Зачем использовать diff и трюк вместо вычитания? ;^) - person beroe; 19.09.2013
comment
@beroe: Потому что вы не можете вычесть две строки? Обратите внимание, что diff используется для вывода списка добавленных файлов (с символом + перед именем файла) и удаленных файлов (с символом - перед именем файла). Список файлов представляет собой строки, сгенерированные ls, и «хитрость» заключается в том, чтобы использовать diff со строками вместо файлов. - person slebetman; 19.09.2013
comment
Видимо, я неправильно понял OP и подумал, что они хотят увидеть, сколько файлов отличается. Неудивительно, что другие решения были более привлекательными... - person beroe; 19.09.2013

Как долго вы хотите этим заниматься? Этот простой код ниже будет отслеживать в течение 60 секунд. Чтобы перейти к бесконечности, измените цикл for на while true; do (тогда таймер не будет увеличиваться, поэтому удалите ссылки на I) Помните о пробелах!

Быстрее получить количество файлов с ls, чем в цикле:

NUMFILES=$(ls | wc -l)
echo "T : NUM : DIFF"
for I in {1..60}; do 
   sleep 1
   NEWNUM=$(ls | wc -l)
   echo $I : $NUMFILES : $[$NEWNUM-$NUMFILES]
   NUMFILES=$NEWNUM
done
person beroe    schedule 19.09.2013
comment
Он хочет видеть, какие файлы были добавлены или удалены, а не просто набор цифр. - person slebetman; 19.09.2013
comment
В мою защиту в заголовке написано: Подсчитайте количество вставленных и удаленных файлов... :^) - person beroe; 19.09.2013
comment
Очень верно. Непослушный ОП. - person SzG; 19.09.2013
comment
Я думаю, что мы все равно были обмануты. Опубликованы две другие формулировки похожих вопросов (см. комментарий выше). Ну что ж. Очень озорной ОП. - person beroe; 25.09.2013