1

От bash очень далек. Задача на сколько я понимаю достаточно тривиальна. Есть некое количество папок с файлами. Необходимо проверять каждую папку на наличие файлов с определенными именами и при совпадении копировать (с заменой) файлы в общую директорию. Плюс возможность логирования действий скрипта.
Погуглил и в плане проверки имен нашел такое решение:

if ! [ -f /path/to/file ]; then

Но при задании такого условия для каждой папки решение получиться мягко говоря громоздким, наверняка все это реализуется изящней.

2

man find

?

Да, у меня Ubuntu.
Нет, не глючит.

3

От bash очень далек

4

Как-то так:

find /SRC_DIR -name "REGEXP_FILE" -type f -exec cp -f "{}" DST_DIR/ \; 

/SRC_DIR — директория, в которой производится поиск;
REGEXP_FILE — шаблон имени файла;
DST_DIR/ — директория, в которую копируются найденные файлы.

Был, был и весь вышел...

5

Для логирования можно к ключу -f добавить -v.

Истинный hotplug - это обычная электрическая розетка: воткнул - работает, и никаких драйверов.
Arch Linux/Xfce/Xiaomi Mi Notebook Pro 15.6 | Slackware64-current/Xfce/Lenovo G580

6 (30.10.2013 11:48:37 отредактировано nik222)

недопонимание момента с шаблоном имени файла - все имена файлов уникальны. Так правильно будет ?

find /SRC_DIR  \( -name "животноводство.xls" -or -name "растениеводство.xls" -or -name "фермеры.xls" \) -type f -exec cp -f "{}" DST_DIR/ \;

Для логирования можно к ключу -f добавить -v.

Извините пожалуйста за тупость, а как указать в какой файл выводить ?

7

Перенаправьте вывод в файл. В конец команды допишите через пробел два знака больше, пробел и имя файла, например log.txt. Или через pipe результат работы команды отдайте tee, запущенной с ключом -а, и log.txt в качестве параметра.

Истинный hotplug - это обычная электрическая розетка: воткнул - работает, и никаких драйверов.
Arch Linux/Xfce/Xiaomi Mi Notebook Pro 15.6 | Slackware64-current/Xfce/Lenovo G580

8

nik222 пишет:

недопонимание момента с шаблоном имени файла - все имена файлов уникальны. Так правильно будет ?

nik222 пишет:

\( -name "животноводство.xls" -or -name "растениеводство.xls" -or -name "фермеры.xls" \)

-name "*.xls"
Был, был и весь вышел...

9 (30.10.2013 13:31:59 отредактировано nik222)

нужно проверять наличие конкретных файлов в поддиректориях, не по расширению а именно по имени файла

10 (30.10.2013 13:40:23 отредактировано Lupo Alberto)

nik222 пишет:

нужно проверять наличие конкретного файлов в поддиректориях, не по расширению а именно по имени файла

Тогда можно так:
1. Создать файл с именами всех нужных файлов, каждое имя в отдельной строке.
2. Обернуть всё это дело в цикл

for i in $(cat file_name.txt); do find /SRC_DIR -name "$i" -exec cp -fv "{}" DST_DIR/ \; ; done | tee copy.log
Был, был и весь вышел...

11

Извиняюсь за глупость - cp в рамках скрипта при замене файла не требует подтверждения ?

12

nik222 пишет:

cp в рамках скрипта при замене файла не требует подтверждения ?

Зависит от настроек вашей оболочки.
Покажите вывод команды

alias
Был, был и весь вышел...

13

Lupo Alberto пишет:

Покажите вывод команды

alias

...и

which cp
Был, был и весь вышел...

14

alias cp='cp -i'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
alias cp='cp -i'
    /bin/cp

15

nik222 пишет:
alias cp='cp -i'

Ну вот он «виновник»!
В зависимости от используемой вами оболочки (проверить можно echo $SHELL), найдите в файле .zshrc  или .bashrc и т.п. эту строку и закомментируйте её.

Был, был и весь вышел...

16

Lupo Alberto пишет:

Ну вот он «виновник»!
В зависимости от используемой вами оболочки (проверить можно echo $SHELL), найдите в файле .zshrc  или .bashrc и т.п. эту строку и закомментируйте её.

...либо используйте полный путь к команде, т.е. /usr/bin/cp.

Был, был и весь вышел...

17

еще один момент - если не находится файл с именем из списка, скрипт дальше продолжает работать или останавливается ?

18

nik222 пишет:

еще один момент - если не находится файл с именем из списка, скрипт дальше продолжает работать или останавливается ?

Продолжает работать.

Был, был и весь вышел...

19

Lupo Alberto пишет:
Lupo Alberto пишет:

Ну вот он «виновник»!
В зависимости от используемой вами оболочки (проверить можно echo $SHELL), найдите в файле .zshrc  или .bashrc и т.п. эту строку и закомментируйте её.

...либо используйте полный путь к команде, т.е. /usr/bin/cp.

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

Истинный hotplug - это обычная электрическая розетка: воткнул - работает, и никаких драйверов.
Arch Linux/Xfce/Xiaomi Mi Notebook Pro 15.6 | Slackware64-current/Xfce/Lenovo G580

20

а почему полный путь ?

21

nik222 пишет:

а почему полный путь ?

В данном случае, чтобы использовалась непосредственно сама команда cp, а не алиас на неё — cp -i.

Был, был и весь вышел...

22

ну а предположим что после проверки по имени необходимо еще проверить по дате ?

23 (01.11.2013 16:11:39 отредактировано Lupo Alberto)

nik222 пишет:

ну а предположим что после проверки по имени необходимо еще проверить по дате ?

По дате чего? Создания файла, доступа к файлу или модификации файла?

Был, был и весь вышел...

24

Lupo Alberto пишет:

REGEXP_FILE — шаблон имени файла;

минусануть вас что-ли? Но не буду, администратор, который путает глоббинг с рекулярками -- смешной. И очень хорошо характеризует техническую грамотность здешней администрации...

nik222 пишет:

cp в рамках скрипта при замене файла не требует подтверждения ?

нет, не требует. Потому-что алиасы в скриптах НЕ работают.

nik222 пишет:

нужно проверять наличие конкретных файлов в поддиректориях, не по расширению а именно по имени файла

в Linux НЕТ никаких "расширений". Они остались в MS-DOS.

Можно использовать глоббинг:
find ... -name "filename.*"

Можно использовать регулярные выражения прямо в find

nik222 пишет:

ну а предположим что после проверки по имени необходимо еще проверить по дате ?

тогда после find ... -name ... нужно дописать проверку времени. Их довольно много разных:

1. абсолютные (раньше чем, после того), например "все файлы изменённые за последнюю неделю" -mtime -7

2. относительные (после того КАК), например "файлы новее этого" -newer этот.

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

25

drBatty пишет:

Но не буду, администратор, который путает глоббинг с рекулярками -- смешной. И очень хорошо характеризует техническую грамотность здешней администрации...

Я уже давно не администратор, так что смелее, не сдерживайте себя — это вредно.

Был, был и весь вышел...

26

Lupo Alberto пишет:

Я уже давно не администратор, так что смелее, не сдерживайте себя — это вредно.

вы лучше исправьте свою ошибку. Оно же ведь как -- ошибка заразна. Другие тоже будут путать тёплое с мягким. Это разве хорошо? По-русски у вас правильно написано "шаблон имени файла", а зачем было писать REGEXP? Это вообще-то общепринятый технический термин. Что-бы find их понимала, надо юзать -regex, а не -name.

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)