Поиск и проблемы с bash в последних версиях Ubuntu

У меня была проблема последние шесть месяцев или около того при объединении поисковых запросов в bash. Точный пример связан с программированием на Python, но применим к любому обнаружению / манипуляции.

Предположим, что мне нужен список всех файлов Python в каталоге, где я есть. Это легко:

find . -name '*.py'

Теперь предположим, что меня интересуют только те файлы Python, которые содержат строку «psycopg», например. потому что я хочу перейти из старой библиотеки доступа PostgreSQL psycopg к psycopg2. Все еще достаточно легко:

grep -l psycopg `find . -name '*.py'`

Теперь предположим, что я хочу сделать полный список этих файлов, чтобы проверить их штампы даты, чтобы увидеть, когда я последний раз их касался. Я также хотел бы открыть их в gedit, но давайте придерживаться списка:

ls -l `!!`

, который расширяется до

ls -l `grep -l psycopg `find . -name '*.py'``

Теперь, что происходит? Ответ: Ничего. Приглашение bash просто зависает. Почему это? Это может быть неправильный способ делать что-то, но он работал. Я уверен, что он работал до Ubuntu 10.10 или 10.04.

2
задан 12 May 2011 в 17:52

36 ответов

Backticks не гнездятся. Первая встроенная команда: grep -l psycopg , которая будет прослушивать stdin для данных, потому что нет имен файлов.

Я бы сказал, что привык к использованию $ (этот синтаксис) вместо backticks, потому что они правильно вписываются.

  ls -l $ (grep -l psycopg $ (find. -name \ * py))  
5
ответ дан 10 August 2018 в 09:46

Сделайте это, в общем, наоборот, найдите в них файлы, grep и используйте наборы ls:

  find.  -name '* .py' -exec grep -q psycopg {} ";"  -l  

возможны специальные формы вывода (printf) и перечислены в справочной странице find.

5
ответ дан 10 August 2018 в 09:46

Всегда неправильно иметь команды, которые выводят более одного имени файла внутри $ () или `` (подстановка команды). См. [D0] http://mywiki.wooledge.org/ParsingLs для объяснения, почему вы не должны этого делать.

Также читайте http: //mywiki.wooledge .org / UsingFind и http://mywiki.wooledge.org/BashFAQ/020 о том, как правильно использовать поиск и иметь дело с именами файлов.

И нет,

  ls -l `grep -l psycopg` find.  -name '* .py'``  

не мог работать и в более ранних версиях.

Ответ пользователя неизвестен показывает хороший и безопасный способ сделать задание, о котором вы спрашивали.

1
ответ дан 10 August 2018 в 09:46

Backticks не гнездятся. Первая встроенная команда: grep -l psycopg , которая будет прослушивать stdin для данных, потому что нет имен файлов.

Я бы сказал, что привык к использованию $ (этот синтаксис) вместо backticks, потому что они правильно вписываются.

  ls -l $ (grep -l psycopg $ (find. -name \ * py))  
5
ответ дан 13 August 2018 в 16:00
  • 1
    И тебе спасибо. Забавно, что, как я заметил, они использовали для гнезда - или, по крайней мере, я думаю, что они это сделали, я использую эту технику в течение многих лет. Но это правда, я приобрел привычку использовать backtips назад, когда я все еще использовал tcsh. Вместо этого нужно привыкнуть к $ (...). – Carsten Agger 12 May 2011 в 18:50
  • 2
    Upvote. Просто примечание: IIRC / bin / bash по умолчанию Ubuntu на самом деле тире не настоящий bash. Это может быть частью того, почему они больше не гнездится должным образом. – RobotHumans 2 April 2012 в 05:26
  • 3
    @ aking1012, вы имеете в виду / bin / sh тире. – glenn jackman 2 April 2012 в 17:51
  • 4
    Да. Ты прав. – RobotHumans 2 April 2012 в 17:59

Сделайте это, в общем, наоборот, найдите в них файлы, grep и используйте наборы ls:

  find.  -name '* .py' -exec grep -q psycopg {} ";"  -l  

возможны специальные формы вывода (printf) и перечислены в справочной странице find.

5
ответ дан 13 August 2018 в 16:00

Всегда неправильно иметь команды, которые выводят более одного имени файла внутри $ () или `` (подстановка команды). См. [D0] http://mywiki.wooledge.org/ParsingLs для объяснения, почему вы не должны этого делать.

Также читайте http: //mywiki.wooledge .org / UsingFind и http://mywiki.wooledge.org/BashFAQ/020 о том, как правильно использовать поиск и иметь дело с именами файлов.

И нет,

  ls -l `grep -l psycopg` find.  -name '* .py'``  

не мог работать и в более ранних версиях.

Ответ пользователя неизвестен показывает хороший и безопасный способ сделать задание, о котором вы спрашивали.

1
ответ дан 13 August 2018 в 16:00

Другие вопросы по тегам:

Похожие вопросы: