Страница 1 из 1
Поиск файлов по маске и их переименование.
Добавлено: 2013-07-30 11:30:33
Vlad5503
Суть проблемы такова:
Есть прог-а, ведущая статистику по юзерам. В каждой директории есть файл который пишется в течении определённого времени и потом переименовывается программой. Программа делает резервную копию вида
. Вроде всё как надо. Но...
Когда сервер "падает"(было пару раз) и после запуска сервера, в директориях создаются файлы нулевой величины, но программа не делает восстановление этого файла из резервной копии
.
Код программы закрыт. Изменить я не могу, автора не найти
Задача: вести поиск файла нулевой длины в директории юзера и заменить его резервным файлом из этой же директории.
Пробую написать скриптик такой:
Код: Выделить всё
#!bin/sh
echo "Poisk files STAT size=0"
cd /usr/users #переходим в директорию где находятся папки юзеров с их статистикой
for i in `find /usr/scripts -name "stat" -type f -size 0c` #ищем файл по имени stat, с нулевым размером
do
for t in `find $i -name "stat.bak"` #ищем в этой же папке юзера резервный файл stat.bak
do
cp $k $i #копируем резервный файл stat.bak в рабочий файл stat
done
done
echo STOP
по идее он должен работать пока не пройдёт все вложенные директории от /usr/users, с заменой пустого файла на резервный.
Но скрипт однако берет первый попавшийся stat.bak и копирует его во все директории, где есть нулевой файл stat.
Пршу подсказать, где я ошибся...
Re: Поиск файлов по маске и их переименование.
Добавлено: 2013-07-30 15:03:49
snorlov
1. вторая переменная у вас t, а копируете k
2. поиск во-втором случае ограничьте только текущим каталогом...
Re: Поиск файлов по маске и их переименование.
Добавлено: 2013-07-30 18:05:39
GhOsT_MZ
А зачем второй find? Гораздо проще `ls -1 ./$i | grep "^stat.bak"`
Re: Поиск файлов по маске и их переименование.
Добавлено: 2013-07-30 19:30:45
Гость
Замечание по переменной принято, спасибо.
Небольшое уточнение.
в директории usr/scripts находятся ещё директории по именам юзеров. их там около 1000. в каждой директории лежат файлы stat, используемый в текущей работе, и файл stat.bak, который создается каждые 15минут из файла stat.
может я что-то не так понял, но применив
получил это:
Код: Выделить всё
sh findstat.sh
Poisk files STAT size=0
ls: .//usr/scripts/111/stat: No such file or directory
usage: cp [-R [-H | -L | -P]] [-f | -i | -n] [-alpvx] source_file target_file
cp [-R [-H | -L | -P]] [-f | -i | -n] [-alpvx] source_file ... target_directory
ls: .//usr/scripts/pipe-table/stat: No such file or directory
usage: cp [-R [-H | -L | -P]] [-f | -i | -n] [-alpvx] source_file target_file
cp [-R [-H | -L | -P]] [-f | -i | -n] [-alpvx] source_file ... target_directory
ls: .//usr/scripts/stat: No such file or directory
usage: cp [-R [-H | -L | -P]] [-f | -i | -n] [-alpvx] source_file target_file
cp [-R [-H | -L | -P]] [-f | -i | -n] [-alpvx] source_file ... target_directory
Т.е. файл "stat.bak" не найден. Но реально то он есть.
Re: Поиск файлов по маске и их переименование.
Добавлено: 2013-07-30 19:37:46
GhOsT_MZ
Гость писал(а):Замечание по переменной принято, спасибо.
Небольшое уточнение.
в директории usr/scripts находятся ещё директории по именам юзеров. их там около 1000. в каждой директории лежат файлы stat, используемый в текущей работе, и файл stat.bak, который создается каждые 15минут из файла stat.
может я что-то не так понял, но применив
получил это:
Код: Выделить всё
sh findstat.sh
Poisk files STAT size=0
ls: .//usr/scripts/111/stat: No such file or directory
usage: cp [-R [-H | -L | -P]] [-f | -i | -n] [-alpvx] source_file target_file
cp [-R [-H | -L | -P]] [-f | -i | -n] [-alpvx] source_file ... target_directory
ls: .//usr/scripts/pipe-table/stat: No such file or directory
usage: cp [-R [-H | -L | -P]] [-f | -i | -n] [-alpvx] source_file target_file
cp [-R [-H | -L | -P]] [-f | -i | -n] [-alpvx] source_file ... target_directory
ls: .//usr/scripts/stat: No such file or directory
usage: cp [-R [-H | -L | -P]] [-f | -i | -n] [-alpvx] source_file target_file
cp [-R [-H | -L | -P]] [-f | -i | -n] [-alpvx] source_file ... target_directory
Т.е. файл "stat.bak" не найден. Но реально то он есть.
ок, тогда: `ls -1 $i | grep "^stat.bak"`
Re: Поиск файлов по маске и их переименование.
Добавлено: 2013-07-30 19:41:01
Гость
ls -"ай" или "один" ?
в обоих случаях получаю это:
Код: Выделить всё
sh findstat.sh
Poisk files STAT size=0
usage: cp [-R [-H | -L | -P]] [-f | -i | -n] [-alpvx] source_file target_file
cp [-R [-H | -L | -P]] [-f | -i | -n] [-alpvx] source_file ... target_directory
usage: cp [-R [-H | -L | -P]] [-f | -i | -n] [-alpvx] source_file target_file
cp [-R [-H | -L | -P]] [-f | -i | -n] [-alpvx] source_file ... target_directory
usage: cp [-R [-H | -L | -P]] [-f | -i | -n] [-alpvx] source_file target_file
cp [-R [-H | -L | -P]] [-f | -i | -n] [-alpvx] source_file ... target_directory
STOP
Re: Поиск файлов по маске и их переименование.
Добавлено: 2013-07-30 19:44:58
Гость
добавил слеш в строке, чтоб ls зашел во вложенную директорию.
вот так:
получаю:
Код: Выделить всё
sh findstat.sh
Poisk files STAT size=0
ls: //usr/scripts/111/stat/: Not a directory
usage: cp [-R [-H | -L | -P]] [-f | -i | -n] [-alpvx] source_file target_file
cp [-R [-H | -L | -P]] [-f | -i | -n] [-alpvx] source_file ... target_directory
ls: //usr/scripts/pipe-table/stat/: Not a directory
usage: cp [-R [-H | -L | -P]] [-f | -i | -n] [-alpvx] source_file target_file
cp [-R [-H | -L | -P]] [-f | -i | -n] [-alpvx] source_file ... target_directory
ls: //usr/scripts/stat/: Not a directory
usage: cp [-R [-H | -L | -P]] [-f | -i | -n] [-alpvx] source_file target_file
cp [-R [-H | -L | -P]] [-f | -i | -n] [-alpvx] source_file ... target_directory
STOP
Re: Поиск файлов по маске и их переименование.
Добавлено: 2013-07-30 19:49:36
Vlad5503
Подправил ошибку в команде.
Теперь
Код: Выделить всё
ls -1 /usr/scripts/ | grep "stat.bak"
stat.bak
Re: Поиск файлов по маске и их переименование.
Добавлено: 2013-07-30 19:54:57
GhOsT_MZ
Что выводит это:
Код: Выделить всё
#!bin/sh -x
needle="stat";
echo "Poisk files STAT size=0";
#переходим в директорию где находятся папки юзеров с их статистикой
cd /usr/users;
#ищем файл по имени stat, с нулевым размером
for i in `find /usr/scripts -name "${needle}" -type f -size 0c`;
do
#ищем в этой же папке юзера резервный файл stat.bak
for t in `ls -1 /$i/ | grep "^${needle}.bak$"`;
do
#копируем резервный файл stat.bak в рабочий файл stat
echo cp $t $i;
done;
done;
echo STOP;
Re: Поиск файлов по маске и их переименование.
Добавлено: 2013-07-30 20:02:19
Vlad5503
Ваша версия :
Код: Выделить всё
sh findstat-2.sh
Poisk files STAT size=0
cd: /usr/users: No such file or directory
ls: //usr/scripts/111/stat/: Not a directory
ls: //usr/scripts/pipe-table/stat/: Not a directory
ls: //usr/scripts/stat/: Not a directory
STOP
Команда
Код: Выделить всё
find /usr/scripts -name "${needle}" -type f -size 0c
выдает полный путь с искомым файлом.
Код: Выделить всё
find /usr/scripts -name "stat" -type f -size 0c
/usr/scripts/111/stat
/usr/scripts/pipe-table/stat
/usr/scripts/stat
что не дает заменить резервным файлом директорию...
надо как-то обрезать путь от искомого файла(нулевой величины)..
Re: Поиск файлов по маске и их переименование.
Добавлено: 2013-07-30 20:06:32
GhOsT_MZ
А в идеале вообще так:
Код: Выделить всё
#!bin/sh -x
needle="stat";
echo "Poisk files STAT size=0";
#переходим в директорию где находятся папки юзеров с их статистикой
cd /usr/users;
#ищем файл по имени stat, с нулевым размером
for i in `find /usr/scripts -name "${needle}" -type f -size 0c`;
do
test -s "$i/${needle}.bak" && cp "$i/${needle}.bak" "$i";
done;
echo STOP;
Re: Поиск файлов по маске и их переименование.
Добавлено: 2013-07-30 20:08:20
GhOsT_MZ
Vlad5503 писал(а):Ваша версия :
Команда
Код: Выделить всё
find /usr/scripts -name "${needle}" -type f -size 0c
выдает полный путь с искомым файлом.
Код: Выделить всё
find /usr/scripts -name "stat" -type f -size 0c
/usr/scripts/111/stat
/usr/scripts/pipe-table/stat
/usr/scripts/stat
что не дает заменить резервным файлом директорию...
надо как-то обрезать путь от искомого файла(нулевой величины)..
http://www.freebsd.org/cgi/man.cgi?quer ... ormat=html
PS: под решение задачи подойдет предыдущий пост
Re: Поиск файлов по маске и их переименование.
Добавлено: 2013-07-30 20:33:24
Vlad5503
......
http://www.freebsd.org/cgi/man.cgi?quer ... ormat=html
PS: под решение задачи подойдет предыдущий пост[/quote]
подходит для обрезки:
получим на выводе:
но вот применить при поиске и переименовании что-то не соображу никак....
Re: Поиск файлов по маске и их переименование.
Добавлено: 2013-07-30 20:39:55
GhOsT_MZ
А зачем чтото изобретать?
Вот поидее рабочий вариант:
Код: Выделить всё
#!bin/sh
base="/usr/scripts";
needle="stat";
echo "Search empty stat files at `date`";
cd "${base}";
# find empty stat file
for i in `find ${base} -name "${needle}" -type f -size 0c`;
do
# if stat.bak not empty, replace stat file ($i variable is full path to stat file)
test -s "${i}.bak" && { cp "${i}.bak" "$i" && echo "${i} replaced..." || echo "${i} not replaced"; } || echo "${i}.bak not found";
done;
echo "Complete at `date`";
Re: Поиск файлов по маске и их переименование.
Добавлено: 2013-07-30 21:02:32
GhOsT_MZ
Даже на коробке с фряхой проверил, работает. Немного доделал, чтобы было красиво, теперь выводт не только сообщения, но exit code:
Код: Выделить всё
#!/bin/sh
base="/usr/scripts";
needle="stat";
error=0;
echo "Search empty stat files at `date`";
for i in `find ${base} -name "${needle}" -type f -size 0c`;
do
test -s "${i}.bak" &&
{
cp "${i}.bak" "$i" > /dev/null 2>&1 && echo "${i} replaced..." ||
{
echo "${i} not replaced"; error=1;
}
} || {
echo "${i}.bak not found or empty"; error=1;
}
done;
echo "Complete at `date`";
exit $error;
Re: Поиск файлов по маске и их переименование.
Добавлено: 2013-07-30 21:26:02
Vlad5503
Спасибо огромное!!!
Пока проверял и писал ответ Вы уже дописали то что надо было.
Решил проверить а во всех ли директориях есть резервный файл?
Оказалось нет.
Проверил всё той же командой
Код: Выделить всё
find /usr/scripts/ -name "stat.bak" -type f > /usr/scripts/findbak.log
Последняя версия Вашего скрипта показала на экране эти директории.
Надо будет вручную чтоли создать эти резервные файлы. Понаблюдать за ними - будет ли их основная прога обновлять или нет...
Ещё раз благодарю за оказанную помощь.
Re: Поиск файлов по маске и их переименование.
Добавлено: 2013-07-30 21:40:49
Vlad5503
файл stat.bak имеет 1487 директорий.
файл stat (не нулевого размера) имеет 1059 директорий.
получается если юзер не активен долгое время, то программа не создает файл stat.bak в его директории.
вопрос тогда - а как восстановить или создать не существующих 428 файлов ?
надо думать...
Re: Поиск файлов по маске и их переименование.
Добавлено: 2013-07-30 21:43:13
GhOsT_MZ
Vlad5503 писал(а):файл stat.bak имеет 1487 директорий.
файл stat (не нулевого размера) имеет 1059 директорий.
получается если юзер не активен долгое время, то программа не создает файл stat.bak в его директории.
вопрос тогда - а как восстановить или создать не существующих 428 файлов ?
надо думать...
То есть, восстановить файлы, которых нет, из bak-файла, который существует?
Re: Поиск файлов по маске и их переименование.
Добавлено: 2013-07-30 21:50:28
Vlad5503
GhOsT_MZ писал(а):Vlad5503 писал(а):файл stat.bak имеет 1487 директорий.
файл stat (не нулевого размера) имеет 1059 директорий.
получается если юзер не активен долгое время, то программа не создает файл stat.bak в его директории.
вопрос тогда - а как восстановить или создать не существующих 428 файлов ?
надо думать...
То есть, восстановить файлы, которых нет, из bak-файла, который существует?
Вопрос снят.
Так как это не активные юзера. Проверил на одном - создал актвиность под его именем и файлики появились с помощью основной программы.
Думаю вопрос Вашей помощью решен на 100%.
