LinuxForum.Fans
Тема

скрипт

Автор: trung_bui 22 сообщений 1456 просмотров
17.04.2017 16:43 #422353

здравствуйте,
надо написать скрипт,копирующий в заданный каталог исполняемые файлы из другого заданого каталога.Имена каталогов задаются в абсолютной форме.

можете подсказать алгоритм как его написать или идея какие-нибудь

17.04.2017 17:22 #422354

Подсказываю:

[console]
man find
man cp

find /path_to_dir_1/ -executable -type f -exec cp '{}' /path_to_dir_2/ \;

[/console]

Дальше сами.

17.04.2017 17:25 #422355
text
find каталог1 -executable -exec cp {} каталог2/ \;

Это требуется?

17.04.2017 21:13 #422357

[console]
#!/bin/bash
echo $1
echo $2
find $1 -type f
while [ -f $1 ]
do
if [ -x $1 ]
then cp $1 $2
fi
done
[/console]
почему то он только ищет файлы но не копируют их в другую папку
можете подсказать в чем ошибку?

17.04.2017 22:11 #422359

Потому что условие while у тебя не правильное. И find работает впустую.

17.04.2017 22:16 #422360

[console]
#!/bin/bash
echo $1
echo $2
for f in $1/*
do
if [ -x $f ]
then
cp $f $2
fi
done

[/console]
я кое-как исправил
файлы вроде копируется
но почему при запуске скрипта он пишет что
[console]
cp:пропускается каталог
[/console]

17.04.2017 22:19 #422361

Значит у тебя там есть каталог. На каталогах же тоже стоит бит исполняемости. А cp без параметра -r не копирует каталоги.

17.04.2017 22:21 #422362

значит мой скрипт нормально работает получается?)))

17.04.2017 22:43 #422363
"i2ks" написал:
Подсказываю:
Консоль

man find
man cp
Можно еще так: [console=inline]ls -l | egrep '\-..x' | awk '{print $9}'[/console]
Такая конструкия уберет из листинга каталоги с битом Х, оставив только регулярные файлы.
Добавлено: 17th Apr 2017 9:43:10 pm

"trung.bui" написал:
cp:пропускается каталог

Давай по порядку:
[console=inline]#!/bin/bash[/console]
[console=inline]echo $1 ##Зачем это? [/console]
[console=inline]echo $2 ##и это? [/console]
[console=inline]for f in $1/* ##В задаче ведь стоит "ИСПОЛНЯЕМЫЕ ФАЙЛЫ"!!, зачем нам листинг всей директории с поддиректориями, линками и т.д.?Смотри выше [/console]
[console=inline]do[/console]
   [console=inline]if [ -x $f ] ##Идея та, только переменные в двойные кавычки заворачивать нужно, ибо пробелы в именах бывают[/console]
      [console=inline]then[/console]
          [console=inline] cp $f $2 ##Таже кака с кавычками[/console]
[console=inline] fi[/console]
[console=inline]done[/console]

18.04.2017 09:53 #422375

"DiabloPC" написал:
echo $1 ##Зачем это?
Вангую, он скриппту передает входные параметры.
аля
[console]
./script aaa bbb
[/console]
а далее ищет это все по каталогу, и потом копирует.
18.04.2017 10:15 #422377

i2ks, ага, а зачем входные параметры в консоль выводить? o_O

18.04.2017 10:17 #422378

Можно предположить, что для отладки.

18.04.2017 13:16 #422385

[console]
#!/bin/bash
echo $1
echo $2
for item in "$1"/* ; do
if [ -f "$item" && -x "$item" ] ; then
cp "$item" "$2"
fi
done
[/console]
он вроде работает нормально
но только есть такие моменты например если в каталоге есть подкаталог и он их пропускает
как сделать чтобы он проверял в подкаталоги и копирует файлы в подкаталоге

18.04.2017 13:39 #422386

Это сложнее. Изучай bash, пробуй, мы подскажем если что-то не получится.

P.S. Пожалуйста, не используй тег console для выделения исходников.
Лучше вот так:

text
#!/bin/bash
echo $1
echo $2
for item in "$1"/* ; do 
    if [ -f "$item" &&  -x "$item" ] ; then
        cp "$item" "$2"
    fi
done
18.04.2017 15:53 #422389

А что

text
cp -R

разве для этого не подходит?

18.04.2017 16:03 #422392

cp -r скопирует каталоги с неисполняемыми файлами тоже.

18.04.2017 16:21 #422395
"Vascom" написал:
cp -r скопирует каталоги с неисполняемыми файлами тоже.

так у него проверка стоит,

text
 if [ -f "$item" &&  -x "$item" ] ; then 

, в котором указано то что это файл + исполняемый.

ЕМНИП, то надо использовать такую конструкцию:

text
if [ -f "$item" -a  -x "$item" ] 

или так:

text
if [[ -f "$item" &&  -x "$item" ]] 

p.s. если что не так, то поправьте. *CRAZY*

18.04.2017 16:25 #422396

Да я уже запутался.
Задача простая, но мутно объяснена. Надеюсь топикстартер во всём разобрался.

18.04.2017 18:32 #422402
text

#!/bin/ bash
if [[ $# < 2 ]]; then
    exit
fi
find $1 -type f -executable -exec cp {} $2 \;

я его по другому переделал
он работает
как вам такой вариант?
ну мне все равно интересно как же можно доработать мой первый вариант с циклом
Может кто -нибудь поможете?))
Мне просто любопытно *YES*

18.04.2017 18:36 #422403

с циклом и поддиректориями можно накатать мутный вариант с рекурсиями, но зачем это нужно, особенно на таком тракторе как bash, если есть вполне нормальный find

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