У меня была проблема последние шесть месяцев или около того при объединении поисковых запросов в 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.
Backticks не гнездятся. Первая встроенная команда: grep -l psycopg
, которая будет прослушивать stdin для данных, потому что нет имен файлов.
Я бы сказал, что привык к использованию $ (этот синтаксис)
вместо backticks, потому что они правильно вписываются.
ls -l $ (grep -l psycopg $ (find. -name \ * py))
Сделайте это, в общем, наоборот, найдите в них файлы, grep и используйте наборы ls:
find. -name '* .py' -exec grep -q psycopg {} ";" -l
возможны специальные формы вывода (printf) и перечислены в справочной странице find.
Всегда неправильно иметь команды, которые выводят более одного имени файла внутри $ ()
или ``
(подстановка команды). См. [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'``
не мог работать и в более ранних версиях.
Ответ пользователя неизвестен показывает хороший и безопасный способ сделать задание, о котором вы спрашивали.
Backticks не гнездятся. Первая встроенная команда: grep -l psycopg
, которая будет прослушивать stdin для данных, потому что нет имен файлов.
Я бы сказал, что привык к использованию $ (этот синтаксис)
вместо backticks, потому что они правильно вписываются.
ls -l $ (grep -l psycopg $ (find. -name \ * py))
Сделайте это, в общем, наоборот, найдите в них файлы, grep и используйте наборы ls:
find. -name '* .py' -exec grep -q psycopg {} ";" -l
возможны специальные формы вывода (printf) и перечислены в справочной странице find.
Всегда неправильно иметь команды, которые выводят более одного имени файла внутри $ ()
или ``
(подстановка команды). См. [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'``
не мог работать и в более ранних версиях.
Ответ пользователя неизвестен показывает хороший и безопасный способ сделать задание, о котором вы спрашивали.