Форум русскоязычного сообщества Ubuntu


Хотите сделать посильный вклад в развитие Ubuntu и русскоязычного сообщества?
Помогите нам с документацией!

Автор Тема: ls и grep - непонятки  (Прочитано 3389 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн proctoleha

  • Автор темы
  • Активист
  • *
  • Сообщений: 364
    • Просмотр профиля
ls и grep - непонятки
« : 14 Июля 2010, 00:18:30 »
Объясните пожалуйста для общего развития в чем разница между двумя командами:

ls /path_to_dir | grep *.jpg
и

cd /path_to_dir && ls | grep *.jpg
В первом случае ничего не выводит, хотя если просто запустить
ls /path_to_dir показывает, что картинка в папке лежит, а во втором случае все фильтрует как положено
За что я временами ненавижу Линукс - так это за свои кривые руки

Оффлайн RustemNur

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 2939
  • умрешь с вами
    • Просмотр профиля
Re: ls и grep - непонятки
« Ответ #1 : 14 Июля 2010, 00:32:51 »
Объясните пожалуйста для общего развития в чем разница между двумя командами:

ls /path_to_dir | grep *.jpg

ls /path_to_dir | grep .jpg

Оффлайн muted

  • Любитель
  • *
  • Сообщений: 96
    • Просмотр профиля
Re: ls и grep - непонятки
« Ответ #2 : 14 Июля 2010, 00:34:16 »
ls /path_to_dir | grep *.jpg
у меня работает
^^^ это мой пост? так я пьян, товарищи!
...где еще за флуд героя дадут...

Оффлайн Alex2000

  • Активист
  • *
  • Сообщений: 317
    • Просмотр профиля
Re: ls и grep - непонятки
« Ответ #3 : 14 Июля 2010, 00:35:16 »
Вывод и в первом, и во втором случае будет пустой, поскольку строки *.jpg там нет и быть не может.
Можно так:
ls /path_to_dir | grep .jpg
А лучше так:
ls /path_to_dir/*.jpg

Оффлайн proctoleha

  • Автор темы
  • Активист
  • *
  • Сообщений: 364
    • Просмотр профиля
Re: ls и grep - непонятки
« Ответ #4 : 14 Июля 2010, 00:54:59 »
Цитировать
Вывод и в первом, и во втором случае будет пустой, поскольку строки *.jpg там нет и быть не может.

Это первый случай:
alex@alex:~$ ls /media/old/alex/добавить_картинку/ |grep *.jpg
alex@alex:~$

Это второй, которого быть не может, причем имя файла полностью красное, т.е. grep правильно обработал * и вывел результат
alex@alex:~$ cd /media/old/alex/добавить_картинку/ && ls | grep *.jpg
22082_1.jpg

Цитировать
А лучше так:
ls /path_to_dir/*.jpg

 Это ваш вариант, спасибо кстати за него, это строка из скрипта, теперь она будет меньше -мне нужно получить имя файла, красным выделено .jpg, что в принципе и понятно
alex@alex:~$ ls /media/old/alex/добавить_картинку/ |grep .jpg
22082_1.jpg
За что я временами ненавижу Линукс - так это за свои кривые руки

Оффлайн Jack Sparrow

  • Активист
  • *
  • Сообщений: 630
    • Просмотр профиля
Re: ls и grep - непонятки
« Ответ #5 : 14 Июля 2010, 03:29:46 »
Возможно это потому, что grep бывает разный. Вот, например, у меня на стандартной Убунте 10.04
$ grep --version
GNU grep 2.5.4
"неправильный" вариант со звездочкой однозначно не работает.
Linux is only free if your time has no value (c) Jamie Zawinski

Оффлайн Lion-Simba

  • Старожил
  • *
  • Сообщений: 1126
    • Просмотр профиля
Re: ls и grep - непонятки
« Ответ #6 : 14 Июля 2010, 09:54:00 »
Глядите:

ls /path_to_dir | grep *.jpgКомандная оболочка раскрывает звездочку в разделенный пробелами список всех файлов, находящихся в текущей директории и соответствующих шаблону, получается, например:
ls /path_to_dir | grep 1.jpg 4.jpg 7.jpgв зависимости от того, какие файлы в текущей директории подходят под шаблон "*.jpg".

А в папке /path_to_dir нет ни одного файла, соответствующего получившемуся шаблону grep.

cd /path_to_dir && ls | grep *.jpgА в этом случае текущая директория для будет совпадать с директорией, где выполняется ls, поэтому звездочка раскрывается в список существующих там файлов и grep что-то выводит.
Оказываю индивидуальную платную техподдержку широкого профиля. Обращаться в ЛС или Jabber.

Оффлайн proctoleha

  • Автор темы
  • Активист
  • *
  • Сообщений: 364
    • Просмотр профиля
Re: ls и grep - непонятки
« Ответ #7 : 14 Июля 2010, 10:04:26 »
Спасибо за четкий и внятный ответ!
За что я временами ненавижу Линукс - так это за свои кривые руки

Оффлайн Jack Sparrow

  • Активист
  • *
  • Сообщений: 630
    • Просмотр профиля
Re: ls и grep - непонятки
« Ответ #8 : 14 Июля 2010, 14:11:44 »
Теперь я чего-то не пойму:
jack@jack-laptop:~$ ls Pictures | grep *.jpg # Вариант 1
jack@jack-laptop:~$ cd Pictures && ls | grep *.jpg # Вариант 2
jack@jack-laptop:~/Pictures$ # Оба варианта не сработали
jack@jack-laptop:~/Pictures$ ls
00066495.jpg  00066591.jpg  00066687.jpg
jack@jack-laptop:~/Pictures$ # Но фотографии там есть
ЧЯНТД?
Linux is only free if your time has no value (c) Jamie Zawinski

Оффлайн dimas000

  • Старожил
  • *
  • Сообщений: 1437
  • Ubuntu 9.10 @ 2.6.34
    • Просмотр профиля
Re: ls и grep - непонятки
« Ответ #9 : 14 Июля 2010, 14:50:40 »
grep ищет по регэкспам. если в
ls *.jpgзвездочка означает любую последовательность символов (ну, не совсем любую, наверно, но не суть), то в регэкспах - "любое количество повторов предыдущего символа".
т.е. "5*" будет соответствовать 5,55,555,55555 и т.д. "[a-zA-Z]*" = dgdGRGRdgd, dfdf, F, но не 9ff.
посему: во-первых, действительно проще
ls /path/*.jpgво-вторых, если хочется поиграться с грепом, то правильнее будет
ls -1 | grep "\.jpg$"
ls | grep ".*\.jpg"
в первом случае делаем ls с опцией "один файл - одна строка" и ищем строки, которые заканчиваются на ".jpg"
во втором же первая точка означает любой (почти) символ, звездочка - любое число повторов оного, в конструкции "\." точка "эскейпится" бэкслэшем, что означает именно точку, а не "любой символ". т.е. мы ищем фрагменты текста, соответствующие "что-то-там.jpg"
как-то так. про регэкспы неплохо расписано в википедии, к grep очень многое из того применимо (а что не применимо напрямую - применимо к grep -E). вообще советую освоить, очень сильно иногда помогает
как-то так
лучше на "ты"

Оффлайн Jack Sparrow

  • Активист
  • *
  • Сообщений: 630
    • Просмотр профиля
Re: ls и grep - непонятки
« Ответ #10 : 14 Июля 2010, 17:27:11 »
Да, проблема, конечно, со звездочкой, т.к. думаешь по инерции, как в bash, а это регэксп.
Мне просто не понятно, почему у prostoleha
Цитировать
Это второй, которого быть не может, причем имя файла полностью красное, т.е. grep правильно обработал * и вывел результат
Код:

alex@alex:~$ cd /media/old/alex/добавить_картинку/ && ls | grep *.jpg
22082_1.jpg
и у muted
Цитировать
ls /path_to_dir | grep *.jpgу меня работает
Linux is only free if your time has no value (c) Jamie Zawinski

Оффлайн proctoleha

  • Автор темы
  • Активист
  • *
  • Сообщений: 364
    • Просмотр профиля
Re: ls и grep - непонятки
« Ответ #11 : 14 Июля 2010, 17:38:30 »
Я делал выборку для одного файла - мне надо было получить в переменную его имя и отправить на удаленный хост. Файл строго один. Так вот с одним файлом почему то прокатывает, если несколько не работает. И вот это действительно непонятка, но заморачиваться имхо смысла нет.
« Последнее редактирование: 14 Июля 2010, 19:21:23 от proctoleha »
За что я временами ненавижу Линукс - так это за свои кривые руки

Оффлайн dimas000

  • Старожил
  • *
  • Сообщений: 1437
  • Ubuntu 9.10 @ 2.6.34
    • Просмотр профиля
Re: ls и grep - непонятки
« Ответ #12 : 14 Июля 2010, 20:18:14 »
почему ж нет смысла? давай сюда пример целиком - скрипт, или что там у тебя...
лучше один раз напрячься, автоматизировать процесс и потом получать кайф. пущай компьютер работает на человека, а не наоборот.
Цитировать
Мне просто не понятно, почему у
мб, действительно разные версии. а то вдруг еще алиас какой повешен, мало ли. \grep надо попробовать
лучше на "ты"

Оффлайн proctoleha

  • Автор темы
  • Активист
  • *
  • Сообщений: 364
    • Просмотр профиля
Re: ls и grep - непонятки
« Ответ #13 : 14 Июля 2010, 20:48:07 »
Спасибо еще раз всем ответившим, а особенно уважаемому dimas000, за его комменты и предложение помощи. Но как раз все работает, только щяс все доделал и сижу расслабленныей и довольный, тем более это мой первый скрипт. Не могу не удержаться и не похвастаться (т.к. первый) - да простит меня великий и ужасный модератор :).
Короче этот скрипт при запуске спрашивает - что сцуко хочешь скопировать картинку, или папку на сайт в фотогалерею?  Если выбирается картинка, то он еще спрашивает имя папки на серваке куда будем копировать, потом из заранее прописанной директории берет картиночку, закидывает её и присваивает нужные права. Потом берет имя картинки (вот тут я и использовал grep), и прописывает все что нужно в мускул. И все это происходит при наборе всего одной коротенько команды - ins (алиас типа).
И вобще чем больше влезаю в линукс, тем больше @ею - сколько же я раньше терял времени на всякие гуевые заморочки, да из консоли очень многое быстрей сделаешь, чем по кнопочкам и меню шариться, а как я её боялся сначала :(.
Вот и в данном случае - я могу действовать иначе
1. Через ftp закинуть файл и выставить права
2. Зайти в админку фотогалереи и  прописать новую картинку в базу.
А тут денек посидел, поскрипел и все свелось к вводу трех буковок.
За что я временами ненавижу Линукс - так это за свои кривые руки

Оффлайн Jack Sparrow

  • Активист
  • *
  • Сообщений: 630
    • Просмотр профиля
Re: ls и grep - непонятки
« Ответ #14 : 15 Июля 2010, 02:47:25 »
Попробовал grep *.jpg в папке с одним файлом - действительно работает. А если больше одного, уже нет.
Мда. Вот уж, действительно, прав был старик Декарт, когда говорил, что надо принимать во внимание все мелочи, ничего не упускать.
Почитал ман по поводу поведения звездочки. Но там все скупо. Вообще, в grep главное это регулярные выражения. А там они, практически, не описываются. Вообще,  это отдельная история. Здесь так просто, за чашкой кофе, не освоишь. Нужно как-то задаться мыслью, сесть и выучить, как в свое время сделал с find.
Linux is only free if your time has no value (c) Jamie Zawinski

 

Страница сгенерирована за 0.047 секунд. Запросов: 23.