распечатайте полный путь родительских каталогов вывода находки

Xvfb является X-сервер, предназначенный для ситуаций как Ваши.

2
29.01.2014, 14:30
4 ответа

Принятие ни одних из имен файлов содержит символы новой строки:

find "$PWD" -name __openerp__.py  | awk -F/ -vOFS=/ 'NF-=2' | sort -u
5
27.01.2020, 21:50

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

  1. Передайте $PWD непосредственно найти, вместо того, чтобы определить его для каждой подоболочки. Это сделает find включайте полный путь в его вывод.
  2. Отключите названия родительского каталога с rev и cut.

Таким образом, я предложил бы, чтобы следующее получило список всех каталогов, содержащих желаемый файл:

find "$PWD" -name '__openerp__.py' |
rev                                | 
cut -d/ -f3-                       |
rev

Отметьте это find не заказывает его вывод, таким образом, он должен быть отсортирован прежде uniq'ing это. Как sort уже поддержки, сжимающие идентичные элементы (-u переключатель), с исходным вопросом можно затем ответить:

find "$PWD" -name '__openerp__.py' |
rev                                | 
cut -d/ -f3-                       |
rev                                |
sort -u
3
27.01.2020, 21:50
  • 1
    +1 у sort -u. Я первоначально думал, что все дублирующиеся записи будут смежны, но нет никакой причины его. –  Stéphane Chazelas 29.01.2014, 15:13

Если я понимаю правильно, Вы хотите список каталогов, содержащих подкаталог, содержащий названный файл __openerp__.py, без дубликатов.

В zsh:

print -rl -- **/__openerp__.py(:h:h) | sort -u

или

a=(**/__openerp__.py(:h:h)); print -rl -- ${(u)a}
2
27.01.2020, 21:50
  • 1
    +1 для (: h:h), не сделал знал этого в zsh globbing. –  JackLeo 30.01.2014, 13:18
find . -name "__openerp__.py" -exec sh -c '(cd "{}"/../../; pwd)' \; | uniq
-1
27.01.2020, 21:50
  • 1
    Никогда не включайте {} в коде sh. –  Stéphane Chazelas 29.01.2014, 15:06
  • 2
    @StephaneChazelas почему? положительная сторона –  JackLeo 29.01.2014, 15:12
  • 3
    Поскольку это интерпретируется как код оболочки, поэтому если у Вас есть, например, названный файл $(rm -f "$HOME"), это будет иметь дорогие последствия. Также это не работает вообще во многих find реализации. Использовать sh -c 'cd -P "$1/../.." && pwd' sh {} \; вместо этого. –  Stéphane Chazelas 29.01.2014, 15:15

Теги

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