#linux #bash #ubuntu #inotify #inotifywait
#linux #bash #ubuntu #inotify #inotifywait
Вопрос:
Я пытаюсь создать копию завершенных файлов, которые сохраняются в папке сохранения торрента. Я создал скрипт bash, используя inotifywait для просмотра папки. Мой оригинальный скрипт отлично работал с файлами и папками / вложенными папками. Как только я заменил «-e create -e moved_to» на «-e close_write», он больше не распознает папки, сохраненные в папке просмотра. Теперь он работает только с файлами. Причина, по которой мне нужно перейти на это, заключается в том, что многие мои файлы большие (и многократно хранятся в папках), и для их полного сохранения требуется некоторое время, и скрипт выполняет все процессы до их завершения.
Я также пробовал команду «ждать», но она вообще ничего не делает. Я знаю, что есть более сложные / лучшие / правильные способы его использования, но я еще не разобрался в них.
Вот пример моего скрипта. Любые рекомендации будут оценены с благодарностью. Я не очень хорошо разбираюсь в написании bash-скриптов, так что извините, если это беспорядок.
WATCHED=/mnt/Seeding
DESTINATION=/mnt/Complete-Torrents
user=userid
group=groupid
perms=777
# Step 1 - Copying completed torrents to Complete-Torrents folder leaving original torrents to seed
inotifywait -m -e close_write --format %f $WATCHED
| while read new
do
echo Detected new torrent $new, Copying to Complete-Torrents folder
cp -r "$WATCHED/$new" "$DESTINATION/"
wait
# Step 2 - Deleting unwanted files from Complete-Torrents folder
echo Deleting unwanted files from Complete-Torrents folder
find $DESTINATION -type f -iname "*.txt" -delete
find $DESTINATION -type f -iname "*.nfo" -delete
find $DESTINATION -type f -iname "*.website" -delete
find $DESTINATION -type f -iname "*.exe" -delete
find $DESTINATION -type f -iname "*.html" -delete
find $DESTINATION -type f -iname "*.htm" -delete
find $DESTINATION -type f -iname "*.sfv" -delete
find $DESTINATION -type f -iname "*.parts" -delete
find $DESTINATION -type f -iname "*.jpg" -delete
find $DESTINATION -type f -iname "*.png" -delete
find $DESTINATION -type f -iname "*.doc" -delete
sleep 10
# Step 3 - Change permissions of new files in Complete-Torrents folder
echo Changing ownership and permissions to Complete-Torrents folder and files
chown -R $user:$group "$DESTINATION"
chmod -R $perms "$DESTINATION"
done
Спасибо,
Шон
Редактировать…
Я не могу заставить этот скрипт даже увидеть новую папку, добавленную в папку просмотра. Это буквально НИЧЕГО не делает. Если я заменю close_write
на create
amp; moved_to
и не внесу никаких других изменений, он увидит папку и содержимое и обработает их правильно. Я нахожу это очень странным.
На самом деле я даже пытался создать небольшой тестовый скрипт, чтобы посмотреть, смогу ли я заставить его работать с инструкцией if / elif / else, но еще раз, когда я копирую папку в папку просмотра, скрипт ничего не делает (даже не выполняет цикл). Если я помещаю файл, он выдает правильный вывод.
Вот тестовый скрипт, который я запустил. Может ли кто-нибудь еще подтвердить, могут ли они правильно распознать и обработать новую папку?
#!/bin/bash
WATCHED=/mnt/Watched
inotifywait -re close_write --format '%w%f' -m $STEP1_WATCHED
| while read -r new
do
if [[ -d "$new" ]]; then
echo "Detected new folder $new"
elif [[ -f "$new" ]]; then
echo "Detected new file $new"
else
echo "neither $new"
fi
done
done
Комментарии:
1. Что такое
$STEP1_WATCHED
?2. Не слишком ли много «сделано» в тестовом скрипте?
3. Я ничего не понимаю,. Вы читали инструкцию? Что он говорит, что
close_write
делает?Can someone else confirm if they can get a new folder to be recognized and processed correctly?
Зачем вам это нужно, становится ясно после прочтения справочной страницы, котораяclose_write
не обнаружит создание новой папки. В нем говоритсяA watched file or a file within a watched directory was closed, after being opened in writeable mode
— почему вы ожидаете, что создание каталога будет обнаружено?4. Камильчук … Вау. Хороший улов. Да, я много раз просматривал руководство и по какой-то причине не заметил, что оно применимо только к файлам. Я думаю, если бы там было написано «close_write не обнаружит создание новой папки», я бы это уловил. Но вы правы. Спасибо за улов!
5. Roadowl… Да, вы правы в отношении дополнительного «готово». Камильчук указал, что close_write не видит папок, поэтому моя основная проблема на данный момент не является проблемой. Но теперь мне нужно найти другой способ сделать то, что мне нужно. Спасибо за помощь.
Ответ №1:
Оказывается, проблема здесь была моей ошибкой. За все время, что я читал руководство inotify, я почему-то не понял, что это работает только для файлов, а не для папок. Я, очевидно, искал что-то конкретное и замалчивал то, что говорилось в руководстве о close_write.
Спасибо всем, кто помог!