Вы не вошли.
Страницы 1


Значит так, захотелось мне написать нормальную привязку find к ruby, где не будет бага с символом "\n", в чем смысл идеи, делаем однострочник в баше такой, что бы он печатал имена файлов в массив т.е
files[0] = '.'; files[1] = './.git'; files[2] = './.git/COMMIT_EDITMSG'; files[3] = './.git/config';А потом из руби его eval'им
Попробовал сделать вот так:
index=0; find #{arguments} -exec echo -n "files[$index] = {}"\; index=$((index + 1))\;Проблема в том, что, он только после того, как выполняет echo (!) для абсолютно всех файлов, только тогда выполняет index=$((index + 1))\;
Т.е сначала печатает весь массив, каждый елемент которого с индексом 0 (ноль)
files[0] = '.'; files[0] = './.git'; files[0] = './.git/COMMIT_EDITMSG'; files[0] = './.git/config';Что делать -- не имею представления, прошу местный людей прояснить мне ситуацию.
Кстати, да, собирался делать как-то так:
class File
def find(arguments = '')
files = Array.new
eval(%x[index=0; find #{arguments} -exec echo -n "files[$index] = {}"\; index=$((index + 1))\;].chomp())
end
endОтредактировано Babusha (02-07-11 17:52:09)
Удовлетворен GNU/Linux (с) Linups_Troolvalds
13-значный пароль, состоящий из одних цифр, ломается за полчаса (с) Rector. Авторитетный Хакер у себя в классе
Я тебя просто отсюда выпилю. (с) Рехтур. Взламывает анусы по ойпи.
Вне форума


Значит так, захотелось мне написать нормальную привязку find к ruby
Это просто прекрасно.
Что делать -- не имею представления, прошу местный людей прояснить мне ситуацию.
Да просто всё.
files=($(find <...>))
index=${#files[@]}Отредактировано Linups_Troolvalds (02-07-11 18:25:02)
.:``́3̶E̶P̶O̶W̶h̶`́`:.
Вне форума


Да просто всё.
Да мне не башевский массив нужен, мне нужно что бы печатался массив с синтаксисом руби, а уже из руби я бы его eval`ил. Кстати, да, насчет примеру твоего, если будет в имени файла пробел или символ "\n" то будет ошибка.
Отредактировано Babusha (02-07-11 18:38:03)
Удовлетворен GNU/Linux (с) Linups_Troolvalds
13-значный пароль, состоящий из одних цифр, ломается за полчаса (с) Rector. Авторитетный Хакер у себя в классе
Я тебя просто отсюда выпилю. (с) Рехтур. Взламывает анусы по ойпи.
Вне форума


Да мне не башевский массив нужен, мне нужно что бы печатался массив с синтаксисом руби, а уже из руби я бы его eval`ил. Кстати, да, насчет примеру твоего, если будет в имени файла пробел или символ "\n" то будет ошибка.
А что мешает сначала записать результат в строковую переменную, а потом удалить из него "лишние" символы?
Я не игрушечный. Я, б*я, коллекционный! (с) Duke Nukem Forever
Я не специалист по [вставить название]. Мне главное концептуально решить задачу! (с) АхаRu.
Линукс - это альтернативная ОС о которой известно, что она не является ОС ну вот просто ни разу. (с) Linups_Troolvalds.
А с какого такого перепугу пользователей линукса должно быть больше 1%? (с) petrun
Вне форума


А что мешает сначала записать результат в строковую переменную, а потом удалить из него "лишние" символы?
А в том, что если имя файла будет hello\naabbbcc то тогда ничего не получиться.
Удовлетворен GNU/Linux (с) Linups_Troolvalds
13-значный пароль, состоящий из одних цифр, ломается за полчаса (с) Rector. Авторитетный Хакер у себя в классе
Я тебя просто отсюда выпилю. (с) Рехтур. Взламывает анусы по ойпи.
Вне форума


А в том, что если имя файла будет hello\naabbbcc то тогда ничего не получиться.
Вообще, это как бы ненормальное имя файла. Так что правильным вариантом будет сначала переименовать все такие файлы, чтобы не мучаться. Но можно и такие обработать,угадайте, как.
Отредактировано Linups_Troolvalds (02-07-11 20:00:29)
.:``́3̶E̶P̶O̶W̶h̶`́`:.
Вне форума


А в том, что если имя файла будет hello\naabbbcc то тогда ничего не получиться.
Не понял проблемы, если честно. Ты берёшь "сырую" строку, с "неправильными" символами и исправляешь так, чтобы она могла лечь в твой массив. Заменяешь или удаляешь "неправильные" символы - и потом уже парсишь. Банальная обработка входных данных.
Я не игрушечный. Я, б*я, коллекционный! (с) Duke Nukem Forever
Я не специалист по [вставить название]. Мне главное концептуально решить задачу! (с) АхаRu.
Линукс - это альтернативная ОС о которой известно, что она не является ОС ну вот просто ни разу. (с) Linups_Troolvalds.
А с какого такого перепугу пользователей линукса должно быть больше 1%? (с) petrun
Вне форума


Вообще, это как бы ненормальное имя файла. Так что правильным вариантом будет сначала переименовать все такие файлы, чтобы не мучаться.
Ты это скажи файловой системе.
Но можно и такие обработать, угадайте, как.
find -print0 | xargs ?
Не понял проблемы, если честно. Ты берёшь "сырую" строку, с "неправильными" символами и исправляешь так, чтобы она могла лечь в твой массив. Заменяешь или удаляешь "неправильные" символы - и потом уже парсишь.
Да нахер мне нужен башевский массив? Мне нужно что-бы сформировать из вывода find массив синтаксиса руби, зачем мне башевский массив?
Удовлетворен GNU/Linux (с) Linups_Troolvalds
13-значный пароль, состоящий из одних цифр, ломается за полчаса (с) Rector. Авторитетный Хакер у себя в классе
Я тебя просто отсюда выпилю. (с) Рехтур. Взламывает анусы по ойпи.
Вне форума


Ты это скажи файловой системе.
Файловая система не отвечает за кривые руки допущенного к консоли пользователя.
find -print0 | xargs ?
Куда проще.
files_inodes=($(find <что-то-там> -printf "%i "))Вы же не станете утверждать, что в inode будут недопустимые символы? Нет. Всё, можете делать с ними что угодно.
.:``́3̶E̶P̶O̶W̶h̶`́`:.
Вне форума


Да нахер мне нужен башевский массив? Мне нужно что-бы сформировать из вывода find массив синтаксиса руби, зачем мне башевский массив?
Если нет гербовой бумаги - пишем на простой. Если баш не умеет формировать массив в формате руби - остаётся только предварительная обработка массива баша средствами руби. И вообще - вам шашечки или ехать?
Я не игрушечный. Я, б*я, коллекционный! (с) Duke Nukem Forever
Я не специалист по [вставить название]. Мне главное концептуально решить задачу! (с) АхаRu.
Линукс - это альтернативная ОС о которой известно, что она не является ОС ну вот просто ни разу. (с) Linups_Troolvalds.
А с какого такого перепугу пользователей линукса должно быть больше 1%? (с) petrun
Вне форума


Вы же не станете утверждать, что в inode будут недопустимые символы? Нет. Всё, можете делать с ними что угодно.
Если так, а точно не будет проблем с кривыми символами в именах?
UPD
Черт, так не подходит, есть нормальное решение?
Отредактировано Babusha (02-07-11 20:05:27)
Удовлетворен GNU/Linux (с) Linups_Troolvalds
13-значный пароль, состоящий из одних цифр, ломается за полчаса (с) Rector. Авторитетный Хакер у себя в классе
Я тебя просто отсюда выпилю. (с) Рехтур. Взламывает анусы по ойпи.
Вне форума


Черт, так не подходит, есть нормальное решение?
Нормальным решением является переименование всех таких файлов. Это делается быстро и один раз.
Способ с инодами позволяет обрабатывать файлы с любыми именами. Да, он такой же нестандартный, как и имена файлов с спецсимволами.
И мне пока что непонятна постановка всей задачи. Заполнить массив путями к файлам – ясно, а дальше-то что надо? Зачем из bash передавать массив в ruby?
.:``́3̶E̶P̶O̶W̶h̶`́`:.
Вне форума


Зачем из bash передавать массив в ruby?
Что бы использовать его в Ruby, всегда ваш К.О.
Удовлетворен GNU/Linux (с) Linups_Troolvalds
13-значный пароль, состоящий из одних цифр, ломается за полчаса (с) Rector. Авторитетный Хакер у себя в классе
Я тебя просто отсюда выпилю. (с) Рехтур. Взламывает анусы по ойпи.
Вне форума


Что бы использовать его в Ruby, всегда ваш К.О.
А почему в руби не обработать вывод команды find?
.:``́3̶E̶P̶O̶W̶h̶`́`:.
Вне форума


А почему в руби не обработать вывод команды find?
Можно, конечно %x[find].split("\n")
Но тогда будут глюки со спец символами.
Удовлетворен GNU/Linux (с) Linups_Troolvalds
13-значный пароль, состоящий из одних цифр, ломается за полчаса (с) Rector. Авторитетный Хакер у себя в классе
Я тебя просто отсюда выпилю. (с) Рехтур. Взламывает анусы по ойпи.
Вне форума


Можно, конечно %x[find].split("\n")
Но тогда будут глюки со спец символами.
Если у нас каждое имя заканчивается '\0', было бы странно резать по '\n', да.
.:``́3̶E̶P̶O̶W̶h̶`́`:.
Вне форума


Linups_Troolvalds, ну так ты можешь мне сказать, как через find и параметр -exec реализовать вывод типа:
files[0] = '.'; files[1] = './.git'; files[2] = './.git/COMMIT_EDITMSG'; files[3] = './.git/config';Ну как, скажи?
Добавлено спустя 02 мин 34 с:
Если у нас каждое имя заканчивается '\0', было бы странно резать по '\n', да.
А если в имени файла будет "\0" ?
Удовлетворен GNU/Linux (с) Linups_Troolvalds
13-значный пароль, состоящий из одних цифр, ломается за полчаса (с) Rector. Авторитетный Хакер у себя в классе
Я тебя просто отсюда выпилю. (с) Рехтур. Взламывает анусы по ойпи.
Вне форума


ну так ты можешь мне сказать, как через find и параметр -exec реализовать вывод типа:
Как-то так:
find <...> -print0 | xargs -0 sh -c 'l=$#;for ((i=0;i<l;i++));do echo -e "files[$i]=\x27$1\x27;";shift;done'Только мне постановка задачи всё равно не нравится.
.:``́3̶E̶P̶O̶W̶h̶`́`:.
Вне форума


Babusha, ну в самом деле-то!
в имени файла будет "\0"
hello\naabbbcc
Вы таких файлов много видели?
Вне форума


Вы таких файлов много видели?
Это же юнипс, тут все бывает.
Только мне постановка задачи всё равно не нравится.
Я кстати твой код разобрать не могу, вот блин, если бы еще выводилось как files[$index] = "path"; files[$index] = "path2"; в одну строку, да и еще какае-то странная особенность, почему-то счетчик index обнуляется и весь index начинает считать с самого начала, WTF?. 
Отредактировано Babusha (02-07-11 22:15:51)
Удовлетворен GNU/Linux (с) Linups_Troolvalds
13-значный пароль, состоящий из одних цифр, ломается за полчаса (с) Rector. Авторитетный Хакер у себя в классе
Я тебя просто отсюда выпилю. (с) Рехтур. Взламывает анусы по ойпи.
Вне форума


в одну строку
Это фигня, echo -en
почему-то счетчик index обнуляется и весь index начинает считать с самого начала, WTF?
А в условиях задачи не было ничего про большие массивы.
В любом случае
files=%x[find <...> -print0]и последующие действия с
files.split("\0")вполне спасут отца русской демократии. Про \0 в именах файлов не надо сочинять, это слишком толсто будет, да и можете себе придумать любой разделитель в find хотя бы (-printf'ом), а потом ловить его с помощью руби.
Отредактировано Linups_Troolvalds (03-07-11 01:22:53)
.:``́3̶E̶P̶O̶W̶h̶`́`:.
Вне форума


И вообще - вам шашечки или ехать?
вот уж никогда бы не подумал, что соглашусь со, скажем так, противником по убеждениям (хе-хе), однако здесь поставлю жирный +1.
пока что, на мой взгляд, Babusha не мытьём так кáтаньем пытается показать несостоятельность Bourne Again SHell. и намеренно ставит задачу не до конца, дабы иметь возможность заявить впоследствии, что шелл не смог прочесть его мысли.
all your post are belong to us.
Вне форума


пока что, на мой взгляд, Babusha не мытьём так кáтаньем пытается показать несостоятельность Bourne Again SHell
ЛОР-врачи уже давно поставили диагноз. И, кстати, уже и в null-terminated строки мордочкой потыкали. Я, честно говоря, не понимаю, зачем здесь повторять то же самое. Ведь можно было просто вставить ссылку на свои художества.
.:``́3̶E̶P̶O̶W̶h̶`́`:.
Вне форума


Babusha, я все же не понимаю зачем нужен такой неочевидный способ передачи данных, через eval? Это ведь небезопасно. Разве рубик не дает скриптам параметры своего запуска? По идее должен, следовательно куда уж проще было бы сделать нечто вроде ./имяскрипта --parameter1 value1 --parameter2 value2 и так далее. И тогда проблемы с кривыми символами ушли бы сами собой. Просто ваш изначальный подход is broken by design.
Вне форума
Страницы 1
[ Сгенерировано за 0.011 сек, 7 запросов выполнено - Использовано памяти: 1.79 Мбайт (Пик: 1.87 Мбайт) ]