здравствуйте,
надо написать скрипт,копирующий в заданный каталог исполняемые файлы из другого заданого каталога.Имена каталогов задаются в абсолютной форме.
можете подсказать алгоритм как его написать или идея какие-нибудь
скрипт
Подсказываю:
[console]
man find
man cp
find /path_to_dir_1/ -executable -type f -exec cp '{}' /path_to_dir_2/ \;
[/console]
Дальше сами.
find каталог1 -executable -exec cp {} каталог2/ \;Это требуется?
[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]
почему то он только ищет файлы но не копируют их в другую папку
можете подсказать в чем ошибку?
Потому что условие while у тебя не правильное. И find работает впустую.
[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]
Значит у тебя там есть каталог. На каталогах же тоже стоит бит исполняемости. А cp без параметра -r не копирует каталоги.
значит мой скрипт нормально работает получается?)))
Можно еще так: [console=inline]ls -l | egrep '\-..x' | awk '{print $9}'[/console]Подсказываю:
Консоль
man find
man cp
Такая конструкия уберет из листинга каталоги с битом Х, оставив только регулярные файлы.
Добавлено: 17th Apr 2017 9:43:10 pm
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]
Вангую, он скриппту передает входные параметры.echo $1 ##Зачем это?
аля
[console]
./script aaa bbb
[/console]
а далее ищет это все по каталогу, и потом копирует.
i2ks, ага, а зачем входные параметры в консоль выводить? o_O
Можно предположить, что для отладки.
[console]
#!/bin/bash
echo $1
echo $2
for item in "$1"/* ; do
if [ -f "$item" && -x "$item" ] ; then
cp "$item" "$2"
fi
done
[/console]
он вроде работает нормально
но только есть такие моменты например если в каталоге есть подкаталог и он их пропускает
как сделать чтобы он проверял в подкаталоги и копирует файлы в подкаталоге
Это сложнее. Изучай bash, пробуй, мы подскажем если что-то не получится.
P.S. Пожалуйста, не используй тег console для выделения исходников.
Лучше вот так:
#!/bin/bash
echo $1
echo $2
for item in "$1"/* ; do
if [ -f "$item" && -x "$item" ] ; then
cp "$item" "$2"
fi
doneА что
cp -Rразве для этого не подходит?
cp -r скопирует каталоги с неисполняемыми файлами тоже.
cp -r скопирует каталоги с неисполняемыми файлами тоже.
так у него проверка стоит,
if [ -f "$item" && -x "$item" ] ; then , в котором указано то что это файл + исполняемый.
ЕМНИП, то надо использовать такую конструкцию:
if [ -f "$item" -a -x "$item" ] или так:
if [[ -f "$item" && -x "$item" ]] p.s. если что не так, то поправьте. *CRAZY*
Да я уже запутался.
Задача простая, но мутно объяснена. Надеюсь топикстартер во всём разобрался.
#!/bin/ bash
if [[ $# < 2 ]]; then
exit
fi
find $1 -type f -executable -exec cp {} $2 \;
я его по другому переделал
он работает
как вам такой вариант?
ну мне все равно интересно как же можно доработать мой первый вариант с циклом
Может кто -нибудь поможете?))
Мне просто любопытно *YES*
с циклом и поддиректориями можно накатать мутный вариант с рекурсиями, но зачем это нужно, особенно на таком тракторе как bash, если есть вполне нормальный find