LinuxForum.Fans
Тема

bash: скрипт который создаёт и удаляет файлы

Автор: vitalikmondliak 10 сообщений 2099 просмотров
04.03.2015 21:14 · отредактировано #416445

Всем привет! Помогите пожалуйста.
Итак, у нас есть файл, скажем, file.conf, в который мы записываем в один столбик слова, эти слова являются названиями файлов и могут быть произвольными. Что должен делать скрипт:
- При первом запуске создает директорию /home/files, содержащую пустые файлы с именами указанными в file.conf
- Потом мы добавляем или удаляем из file.conf одну или несколько строк и запускаем скрипт сново. При этом из /home/files должны удалится файлы, удаленные из file.conf. Или добавиться, если были добавлены записи в файл
Суть, значит, в следующем - внесли изменения в файл, запустили скрипт, увидели соответствующие изменения в директории.
Далее ставим скрипт в cron на выполнение каждых 5 минут.

Проблем с созданием файлом нет, а вот удаление есть проблемы.

text
for i in $(cat file.conf); do
touch /home/files/$i
done

Удаление пробую делать вот так, но знаю что это неправильно. Подскажите как сделать правильно...

text
for f in $(ls /home/files); do
for i in $(cat file.conf);
do
    if [ $f != $i ];
    then
rm /home/files/$f
fi
done
done
05.03.2015 09:07 #416498
"vitalikmondliak" написал:
for f in $(ls /home/files); do
text
for f in /home/files/*; do
"vitalikmondliak" написал:
for i in $(cat file.conf);
text
while read i; do
# …
done <file.conf
"vitalikmondliak" написал:
if [ $f != $i ];
text
if [[ "$f" != "$i" ]]
05.03.2015 11:40 #416521
text
for f in /home/files/*; do
while read i; do
    if [[ "$f" != "$i" ]];
    then
echo $f
fi
done <file.conf
done
05.03.2015 14:34 #416556

vitalikmondliak, ну типа того. Хотя нормальные люди для этого юзают rsync.

05.03.2015 16:38 #416572

Не получается так. Оно мне выводит все значения f по несколько раз, а нужно только те, которых нет в файле file.conf.
Может флаги ставить...даже не знаю. Подскажите пожалуйста что делать.

05.03.2015 23:10 · отредактировано #416607
"vitalikmondliak" написал:
Подскажите пожалуйста что делать.
text
#!/bin/bash

strfile=`cat file.conf` strfile2=`ls -1 aaadir/` for i in $strfile do ls aaadir/$i &> /dev/null #Проверяем существование файла if (( $? == 2 )) #Если не существует then #то touch aaadir/$i #создаем fi done # for i in $strfile2 #Поочередно присваиваем переменной i имена файлов в директории do grep "^$i$" file.conf &> /dev/null #Grep'аем эти имена по файлу file.conf на точное совпадение if (( "$?" == 1 )) #Если grep ничего не нашел он возвращает 1 then #А если grep такого названия в file.conf не нашел rm aaadir/$i #удаляем этот файл fi done exit 0

Вот, если еще нужно.
P.S. Вроде работает. Только пути свои поставьте.

05.03.2015 23:48 #416612

Работает. Большое спасибо.

06.03.2015 10:37 #416623
"AntiduPb" написал:
ls aaadir/$i &> /dev/null #Проверяем существование файла

man test

06.03.2015 12:51 · отредактировано #416629
"drBatty" написал:
man test
"Vascom" написал:
Проверка существования файла http://www.bash-scripting.ru/abs/chunks/ch07s02.html
Самый первый параметр.

ok. Спасибо. Буду знать :) Просто на тот момент набыдлокодил как умел :[
P.S. Про test знал, но до мана как-то не доходил. Прочту.

Войдите или зарегистрируйтесь, чтобы ответить.