Поисковые имена классов в банках

Перечислите все имена (не пути) файлов, характерных для всех каталогов.

dirs=( "A dir" "B dir" "C dir" "D dir" )
find "${dirs[@]}" -maxdepth 1 -type f -name "*" -printf '%f\n' |
  sort | uniq -c | sed -n "s/^ *${#dirs[@]} //p"

Или назовите его как файл сценария или функцию с каталогами как параметры.

find "$@" -maxdepth 1 -type f -name "*" -printf '%f\n' |
  sort | uniq -c | sed -n "s/^ *$# //p"
4
19.05.2013, 15:02
2 ответа

Вы передали -l опция, говоря grep только перечислять имена файлов. Это - названия .jar файлы, нет никаких других включенных файлов.

Если Вы хотите grep для вывода имен классов необходимо удалить -l. Но это распечатает много другого спама на той же “строке”, потому что банки являются двоичными файлами, не организованными строками. (С GNU grep, необходимо передать -a получить тот вывод и не только “Двоичный файл … соответствия”.)

С GNU grep, одна возможность состоит в том, чтобы соответствовать полному имени класса и передаче -o производить просто что:

grep -rao --include='*.jar' '[0-9A-Z_a-z]*SignonEJB[0-9A-Z_a-z]*' .

или если Вы хотите пакеты также

grep -rao --include='*.jar' '[$./0-9A-Z_a-z]*SignonEJB[0-9A-Z_a-z]*' .

Другой подход должен работать strings на файлах сначала для извлечения печатаемых строк. (Две команды эквивалентны; sed версия дросселирует на \& и новая строка, awk поддержка версии все символы.)

find . -name '*.jar' -exec sh -c 'strings "$0" | grep SignonEJB | sed "s&^&$0&"' {} \;
find . -name '*.jar' -exec sh -c 'strings "$0" | jar=$0 awk "/SignonEJB/ {print ENVIRON[\"jar\"] \":\" $0}"' {} \;

Кроме того (и строго говоря, более надежно, даже при том, что использование grep вряд ли поднимет ложные положительные стороны), использовать unzip перечислять имена файлов и фильтр это.

find . -name '*.jar' -exec sh -c 'unzip -l -- "$0" | grep SignonEJB' {} \;
4
27.01.2020, 20:51
  • 1
    awk каждый поддерживает все символы, но обратная косая черта (который является, почему я использую ENVIRON в решении я дал). Обратите внимание, что это - пути банки, о которых мы говорим здесь, не пути к классам. –  Stéphane Chazelas 21.05.2013, 09:35

Возможно (с инструментами GNU):

grep -ralZ --include='*.jar' SignonEJB . |
  xargs -r0IJ unzip -l J '*SignonEJB*.class'

Или, возможно, немного более надежный и с выводом, легче читать:

find . -name '*.jar' -exec sh -c 'export i; for i do
    zipinfo -1 "$i" | awk '\''/SignonEJB.*\.class$/{
      print ENVIRON["i"] ": " $0}'\''; done' sh {} +
3
27.01.2020, 20:51

Теги

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