Страницы 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 18:52:09)
Неактивен
Да просто всё.
Да мне не башевский массив нужен, мне нужно что бы печатался массив с синтаксисом руби, а уже из руби я бы его eval`ил. Кстати, да, насчет примеру твоего, если будет в имени файла пробел или символ "\n" то будет ошибка.
Редактировался Babusha (02-07-11 19:38:03)
Неактивен
А что мешает сначала записать результат в строковую переменную, а потом удалить из него "лишние" символы?
А в том, что если имя файла будет hello\naabbbcc то тогда ничего не получиться.
Неактивен
Вообще, это как бы ненормальное имя файла. Так что правильным вариантом будет сначала переименовать все такие файлы, чтобы не мучаться.
Ты это скажи файловой системе.
Но можно и такие обработать, угадайте, как.
find -print0 | xargs ?
Не понял проблемы, если честно. Ты берёшь "сырую" строку, с "неправильными" символами и исправляешь так, чтобы она могла лечь в твой массив. Заменяешь или удаляешь "неправильные" символы - и потом уже парсишь.
Да нахер мне нужен башевский массив? Мне нужно что-бы сформировать из вывода find массив синтаксиса руби, зачем мне башевский массив?
Неактивен
Вы же не станете утверждать, что в inode будут недопустимые символы? Нет. Всё, можете делать с ними что угодно.
Если так, а точно не будет проблем с кривыми символами в именах?
UPD
Черт, так не подходит, есть нормальное решение?
Редактировался Babusha (02-07-11 21:05:27)
Неактивен
Зачем из bash передавать массив в ruby?
Что бы использовать его в Ruby, всегда ваш К.О.
Неактивен
А почему в руби не обработать вывод команды find?
Можно, конечно %x[find].split("\n")
Но тогда будут глюки со спец символами.
Неактивен
Linups_Troolvalds, ну так ты можешь мне сказать, как через find и параметр -exec реализовать вывод типа:
files[0] = '.'; files[1] = './.git'; files[2] = './.git/COMMIT_EDITMSG'; files[3] = './.git/config';
Ну как, скажи?
Добавлено спустя 02 мин 34 с:
Если у нас каждое имя заканчивается '\0', было бы странно резать по '\n', да.
А если в имени файла будет "\0" ?
Неактивен
Babusha, ну в самом деле-то!
в имени файла будет "\0"
hello\naabbbcc
Вы таких файлов много видели?
Неактивен
Вы таких файлов много видели?
Это же юнипс, тут все бывает.
Только мне постановка задачи всё равно не нравится.
Я кстати твой код разобрать не могу, вот блин, если бы еще выводилось как files[$index] = "path"; files[$index] = "path2"; в одну строку, да и еще какае-то странная особенность, почему-то счетчик index обнуляется и весь index начинает считать с самого начала, WTF?.
Редактировался Babusha (02-07-11 23:15:51)
Неактивен
Babusha, я все же не понимаю зачем нужен такой неочевидный способ передачи данных, через eval? Это ведь небезопасно. Разве рубик не дает скриптам параметры своего запуска? По идее должен, следовательно куда уж проще было бы сделать нечто вроде ./имяскрипта --parameter1 value1 --parameter2 value2 и так далее. И тогда проблемы с кривыми символами ушли бы сами собой. Просто ваш изначальный подход is broken by design.
Неактивен
Страницы 1