LinuxForum.Fans
Тема

Проверка по имени файла и последующее копирование

Автор: nik222 26 сообщений 6022 просмотров
#346148

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

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

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

#346161

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

Как-то так:

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

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

#346168

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

#346171

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

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

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

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

#346173

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

#346194
"nik222" написал:
недопонимание момента с шаблоном имени файла - все имена файлов уникальны. Так правильно будет ?
"nik222" написал:
\( -name "животноводство.xls" -or -name "растениеводство.xls" -or -name "фермеры.xls" \)
text
-name "*.xls"
#346199

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

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

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

text
for i in $(cat file_name.txt); do find /SRC_DIR -name "$i" -exec cp -fv "{}" DST_DIR/ \; ; done | tee copy.log
#346226

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

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

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

text

alias
#346228
"Lupo Alberto" написал:
Покажите вывод команды
text
alias

...и

text

which cp
#346230
text
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'
text
alias cp='cp -i'
    /bin/cp
#346231
"nik222" написал:
text
alias cp='cp -i'

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

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

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

#346238

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

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

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

#346259
Lupo Alberto написал:
[quote="Lupo Alberto"]Ну вот он «виновник»!
В зависимости от используемой вами оболочки (проверить можно echo $SHELL), найдите в файле .zshrc или .bashrc и т.п. эту строку и закомментируйте её.

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

#346265

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

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