Поиск файлов по маске и их переименование.

Простые/общие вопросы по UNIX системам. Спросите здесь, если вы новичок

Модераторы: vadim64, terminus

Правила форума
Убедительная просьба юзать теги [cоde] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Vlad5503
сержант
Сообщения: 226
Зарегистрирован: 2010-03-25 5:41:41

Поиск файлов по маске и их переименование.

Непрочитанное сообщение Vlad5503 » 2013-07-30 11:30:33

Суть проблемы такова:
Есть прог-а, ведущая статистику по юзерам. В каждой директории есть файл который пишется в течении определённого времени и потом переименовывается программой. Программа делает резервную копию вида . Вроде всё как надо. Но...
Когда сервер "падает"(было пару раз) и после запуска сервера, в директориях создаются файлы нулевой величины, но программа не делает восстановление этого файла из резервной копии .
Код программы закрыт. Изменить я не могу, автора не найти :cry:
Задача: вести поиск файла нулевой длины в директории юзера и заменить его резервным файлом из этой же директории.

Пробую написать скриптик такой:

Код: Выделить всё

#!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.
Пршу подсказать, где я ошибся...

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

snorlov
подполковник
Сообщения: 3927
Зарегистрирован: 2008-09-04 11:51:25
Откуда: Санкт-Петербург

Re: Поиск файлов по маске и их переименование.

Непрочитанное сообщение snorlov » 2013-07-30 15:03:49

1. вторая переменная у вас t, а копируете k
2. поиск во-втором случае ограничьте только текущим каталогом...

GhOsT_MZ
лейтенант
Сообщения: 662
Зарегистрирован: 2011-04-25 11:40:35
Контактная информация:

Re: Поиск файлов по маске и их переименование.

Непрочитанное сообщение GhOsT_MZ » 2013-07-30 18:05:39

А зачем второй find? Гораздо проще `ls -1 ./$i | grep "^stat.bak"`

Гость
проходил мимо

Re: Поиск файлов по маске и их переименование.

Непрочитанное сообщение Гость » 2013-07-30 19:30:45

Замечание по переменной принято, спасибо.
Небольшое уточнение.
в директории usr/scripts находятся ещё директории по именам юзеров. их там около 1000. в каждой директории лежат файлы stat, используемый в текущей работе, и файл stat.bak, который создается каждые 15минут из файла stat.
может я что-то не так понял, но применив

Код: Выделить всё

`ls -1 ./$i | grep "^stat.bak"`
получил это:

Код: Выделить всё

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" не найден. Но реально то он есть.

GhOsT_MZ
лейтенант
Сообщения: 662
Зарегистрирован: 2011-04-25 11:40:35
Контактная информация:

Re: Поиск файлов по маске и их переименование.

Непрочитанное сообщение GhOsT_MZ » 2013-07-30 19:37:46

Гость писал(а):Замечание по переменной принято, спасибо.
Небольшое уточнение.
в директории usr/scripts находятся ещё директории по именам юзеров. их там около 1000. в каждой директории лежат файлы stat, используемый в текущей работе, и файл stat.bak, который создается каждые 15минут из файла stat.
может я что-то не так понял, но применив

Код: Выделить всё

`ls -1 ./$i | grep "^stat.bak"`
получил это:

Код: Выделить всё

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 зашел во вложенную директорию.
вот так:

Код: Выделить всё

`ls -1 /$i/ | grep "^stat.bak"`
получаю:

Код: Выделить всё

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

Vlad5503
сержант
Сообщения: 226
Зарегистрирован: 2010-03-25 5:41:41

Re: Поиск файлов по маске и их переименование.

Непрочитанное сообщение Vlad5503 » 2013-07-30 19:49:36

Подправил ошибку в команде.
Теперь

Код: Выделить всё

ls -1 /usr/scripts/ | grep "stat.bak"
stat.bak

GhOsT_MZ
лейтенант
Сообщения: 662
Зарегистрирован: 2011-04-25 11:40:35
Контактная информация:

Re: Поиск файлов по маске и их переименование.

Непрочитанное сообщение GhOsT_MZ » 2013-07-30 19:54:57

Что выводит это:

Код: Выделить всё

#!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;

Vlad5503
сержант
Сообщения: 226
Зарегистрирован: 2010-03-25 5:41:41

Re: Поиск файлов по маске и их переименование.

Непрочитанное сообщение Vlad5503 » 2013-07-30 20:02:19

Ваша версия :

Код: Выделить всё

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
что не дает заменить резервным файлом директорию...
надо как-то обрезать путь от искомого файла(нулевой величины)..

GhOsT_MZ
лейтенант
Сообщения: 662
Зарегистрирован: 2011-04-25 11:40:35
Контактная информация:

Re: Поиск файлов по маске и их переименование.

Непрочитанное сообщение GhOsT_MZ » 2013-07-30 20:06:32

А в идеале вообще так:

Код: Выделить всё

#!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;

GhOsT_MZ
лейтенант
Сообщения: 662
Зарегистрирован: 2011-04-25 11:40:35
Контактная информация:

Re: Поиск файлов по маске и их переименование.

Непрочитанное сообщение GhOsT_MZ » 2013-07-30 20:08:20

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: под решение задачи подойдет предыдущий пост

Vlad5503
сержант
Сообщения: 226
Зарегистрирован: 2010-03-25 5:41:41

Re: Поиск файлов по маске и их переименование.

Непрочитанное сообщение Vlad5503 » 2013-07-30 20:33:24

......
http://www.freebsd.org/cgi/man.cgi?quer ... ormat=html

PS: под решение задачи подойдет предыдущий пост[/quote]

подходит для обрезки:

Код: Выделить всё

 basename stat.bak .bak
получим на выводе: но вот применить при поиске и переименовании что-то не соображу никак....

GhOsT_MZ
лейтенант
Сообщения: 662
Зарегистрирован: 2011-04-25 11:40:35
Контактная информация:

Re: Поиск файлов по маске и их переименование.

Непрочитанное сообщение GhOsT_MZ » 2013-07-30 20:39:55

А зачем чтото изобретать?
Вот поидее рабочий вариант:

Код: Выделить всё

#!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`";

GhOsT_MZ
лейтенант
Сообщения: 662
Зарегистрирован: 2011-04-25 11:40:35
Контактная информация:

Re: Поиск файлов по маске и их переименование.

Непрочитанное сообщение GhOsT_MZ » 2013-07-30 21:02:32

Даже на коробке с фряхой проверил, работает. Немного доделал, чтобы было красиво, теперь выводт не только сообщения, но 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;

Vlad5503
сержант
Сообщения: 226
Зарегистрирован: 2010-03-25 5:41:41

Re: Поиск файлов по маске и их переименование.

Непрочитанное сообщение Vlad5503 » 2013-07-30 21:26:02

Спасибо огромное!!!
Пока проверял и писал ответ Вы уже дописали то что надо было. :oops:
Решил проверить а во всех ли директориях есть резервный файл?
Оказалось нет.
Проверил всё той же командой

Код: Выделить всё

find /usr/scripts/ -name "stat.bak" -type f > /usr/scripts/findbak.log
Последняя версия Вашего скрипта показала на экране эти директории.
Надо будет вручную чтоли создать эти резервные файлы. Понаблюдать за ними - будет ли их основная прога обновлять или нет...

Ещё раз благодарю за оказанную помощь.

Vlad5503
сержант
Сообщения: 226
Зарегистрирован: 2010-03-25 5:41:41

Re: Поиск файлов по маске и их переименование.

Непрочитанное сообщение Vlad5503 » 2013-07-30 21:40:49

файл stat.bak имеет 1487 директорий.
файл stat (не нулевого размера) имеет 1059 директорий.
получается если юзер не активен долгое время, то программа не создает файл stat.bak в его директории.
вопрос тогда - а как восстановить или создать не существующих 428 файлов ?
надо думать...

GhOsT_MZ
лейтенант
Сообщения: 662
Зарегистрирован: 2011-04-25 11:40:35
Контактная информация:

Re: Поиск файлов по маске и их переименование.

Непрочитанное сообщение GhOsT_MZ » 2013-07-30 21:43:13

Vlad5503 писал(а):файл stat.bak имеет 1487 директорий.
файл stat (не нулевого размера) имеет 1059 директорий.
получается если юзер не активен долгое время, то программа не создает файл stat.bak в его директории.
вопрос тогда - а как восстановить или создать не существующих 428 файлов ?
надо думать...
То есть, восстановить файлы, которых нет, из bak-файла, который существует?

Vlad5503
сержант
Сообщения: 226
Зарегистрирован: 2010-03-25 5:41:41

Re: Поиск файлов по маске и их переименование.

Непрочитанное сообщение Vlad5503 » 2013-07-30 21:50:28

GhOsT_MZ писал(а):
Vlad5503 писал(а):файл stat.bak имеет 1487 директорий.
файл stat (не нулевого размера) имеет 1059 директорий.
получается если юзер не активен долгое время, то программа не создает файл stat.bak в его директории.
вопрос тогда - а как восстановить или создать не существующих 428 файлов ?
надо думать...
То есть, восстановить файлы, которых нет, из bak-файла, который существует?

Вопрос снят.
Так как это не активные юзера. Проверил на одном - создал актвиность под его именем и файлики появились с помощью основной программы.
Думаю вопрос Вашей помощью решен на 100%.
:drinks: :drinks: