Сценарий, который проверяет удаленные файлы в течение нескольких секунд, заданных в качестве аргумента

Will I lose the wifi and have to recompile the driver?

Да

Драйвер следует перекомпилировать, так как модуль должен находиться по следующему пути:

/lib/modules/$(uname -r)/updates/dkms//rtl8821ae.ko

О старом ядре4.9.0-2:

/lib/modules/4.9.0-2-amd64/updates/dkms//rtl8821ae.ko

На новейшем керенле4.9.0-3:

/lib/modules/4.9.0-3-amd64/updates/dkms//rtl8821ae.ko
-5
15.06.2019, 21:13
3 ответа
#!/bin/sh

snooze=$1

set -- "$HOME"/*

date +'Start: %F %T'
sleep "$snooze"
date +'End:   %F %T'

for pathname do
    if [ ! -e "$pathname" ]; then
        printf 'Deleted from home: %s\n' "${pathname##*/}"
    fi
done

Этот сценарий принимает первый аргумент командной строки $1и присваивает его переменной snooze. Затем он получает имена всех файлов и каталогов в домашнем каталоге (, исключая скрытые имена ), и присваивает их позиционным параметрам ($1, $2и т. д. )

.

Перед засыпанием количества времени, заданного пользователем, он печатает текущую дату и время. После пробуждения ото сна он снова печатает дату и время.

Цикл forперебирает исходные имена, найденные в домашнем каталоге, и проверяет, остались ли они там. Если имя больше не найдено, оно печатается (с удалением пути к каталогу из его пути ).

Вот и все.

Если вы хотите обнаруживать только удаление обычных файлов(или символических ссылок на обычные файлы ), вам нужно убедиться, что список путей, которые мы получаем для вещей в домашнем каталоге содержит только пути к этим файлам:

#!/bin/sh

snooze=$1

set --
for pathname in "$HOME"/*; do
    if [ -f "$pathname" ]; then
        set -- "$@" "$pathname"
    fi
done

date +'Start: %F %T'
sleep "$snooze"
date +'End:   %F %T'

for pathname do
    if [ ! -e "$pathname" ]; then
        printf 'Deleted from home: %s\n' "${pathname##*/}"
    fi
done

Здесь вместо того, чтобы просто сохранять все видимые имена из домашнего каталога, мы перебираем имена и сохраняем только те, которые -fверны для (обычных файлов и символических ссылок. в обычные файлы ). Каталоги будут пропущены. В остальном сценарий такой же, как и раньше.

Обнаружение удаления скрытых файлов проще всего выполнить, переключившись наbash(обратите внимание, что приведенные выше сценарии выполняются с/bin/sh):

#!/bin/bash

shopt -s dotglob

snooze=$1

set --
for pathname in "$HOME"/*; do
    if [ -f "$pathname" ]; then
        set -- "$@" "$pathname"
    fi
done

date +'Start: %F %T'
sleep "$snooze"
date +'End:   %F %T'

for pathname do
    if [ ! -e "$pathname" ]; then
        printf 'Deleted from home: %s\n' "${pathname##*/}"
    fi
done

Обратите внимание, что единственным отличием является строка #!-, указывающая, что теперь это должно быть выполнено интерпретатором /bin/bash, и команда shopt -s dotglob, которая устанавливает параметр оболочки dotglobв bashоболочка. Эта опция оболочки заставляет шаблоны подстановки имен файлов, такие как *, соответствовать скрытым именам, а также именам, не начинающимся с точки.

Дополнительное обнаружение удалений также в подкаталогах звучит немного сложно, но:

это не так.
#!/bin/bash

shopt -s dotglob globstar

snooze=$1

set --
for pathname in "$HOME"/**; do
    if [ -f "$pathname" ]; then
        set -- "$@" "$pathname"
    fi
done

date +'Start: %F %T'
sleep "$snooze"
date +'End:   %F %T'

for pathname do
    if [ ! -e "$pathname" ]; then
        printf 'Deleted from home: %s\n' "${pathname#$HOME/}"
    fi
done

Единственное отличие состоит в том, что мы также включаем опцию globstar. Этот параметр оболочки дает нам доступ к шаблону глобуса **, который соответствует точно так же, как *, но также охватывает /в путях. Таким образом, шаблон $HOME/**будет соответствовать всему в вашем домашнем каталоге.

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

5
28.01.2020, 05:20

Мне кажется, это университетское задание. ваш сценарий не имеет смысла, поэтому я просто попробовал то, что вы говорите.

  • Напишите сценарий, который принимает количество секунд в качестве аргумента, а затем удерживает сеанс в течение периода (сна)

Я предполагаю, что ваш bash-скрипт должен запускаться с таким параметром:./script 30https://tiswww.case.edu/php/chet/bash/bashref.html#Shell-Parameters

  • После этого представляется список файлов, которые были удалены из вашего домашнего каталога.
for file in $HOME/*; do
    # if it is a file
      #save the value of $file on a log file placed not in your $HOME directory
      #delete the file
done

http://mywiki.wooledge.org/BashPitfalls#for_f_in_.24.28ls_.2A.mp3.29

http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_07_01.html

  • Используйте `date' для отображения текущего времени и даты до и после сна. Это говорит само за себя -.
dateBefore="$(date)"
#sleep command here
dateAfter="$(date)"
echo "Date before sleep : $dateBefore"
echo "Date before after sleep : $dateBefore"

Я старался изо всех сил, чтобы помочь вам с этим, так что я могу предположить, что вы можете сделать этот сценарий самостоятельно сейчас. если вы все еще не можете сделать это, справочные страницы и Google — ваш друг:)

0
28.01.2020, 05:20
#!/usr/bin/env bash

sleep_time=$1
time_a=$(date)

mapfile -t files_a < <(find "$HOME" -type f -maxdepth 1)

sleep "$sleep_time"

mapfile -t files_b < <(find "$HOME" -type f -maxdepth 1)

comm -23 <(printf '%s\n' "${files_a[@]}" | sort) <(printf '%s\n' "${files_b[@]}" | sort)

printf '%s\n' "We started at: $time_a" "We ended at: $(date)"
  • sleep_time=$1
    • Вас попросили предоставить аргумент секунд для сна. Ваши аргументы будут представлены как позиционный параметр в вашем скрипте. Это означает, что если вы назовете его как ./script.sh 30, ваш первый позиционный параметр будет равен 30.
  • time_a=$(date)
    • Вы уже поняли это в своем исходном коде, но это будет дата, которую мы будем использовать, чтобы показать, во сколько мы начали
  • mapfile -t files_a < <(find "$HOME" -type f -maxdepth 1)
    • Здесь все становится сложнее. Нам нужно создать список файлов до, чтобы сравнить его с после. Здесь мы используем mapfile для создания массива указанных файлов. Теперь мы могли бы просто создать массив напрямую, но это создало бы проблемы, если бы файлы содержали пробелы или символы новой строки. mapfile будет работать немного лучше.
    • find "$HOME" -type f -maxdepth 1-Будет напечатан список файлов всех типов в вашем $HOMEкаталоге (, не рекурсивном ни в какие подкаталоги)
  • sleep "$sleep_time"
    • Здесь мы спим указанное время
  • mapfile -t files_b < <(find "$HOME" -type f -maxdepth 1)
    • Мы создаем второй массив файлов после сна для сравнения
  • comm -23 <(printf '%s\n' "${files_a[@]}" | sort) <(printf '%s\n' "${files_b[@]}" | sort)
    • Утилита commчитает два файла и печатает 3 столбца:(1 )Только строки в файле 1, (2 )Только строки в файле 2, (3 )Строки в обоих файлах. Поскольку нас интересуют только строки, уникальные для файла file1, мы используем аргументы -23для подавления столбцов 2 и 3. Затем, поскольку мы сохраняем файлы в массиве, а не в файле, мы используем Подстановку процесса для передачи массивов. на comm, как если бы они были файлами.
  • printf '%s\n' "We started at: $time_a" "We ended at: $(date)"
    • Печать времени начала и окончания.
2
28.01.2020, 05:20

Теги

Похожие вопросы