Перечислите все имена (не пути) файлов, характерных для всех каталогов.
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"
Вы передали -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' {} \;
Возможно (с инструментами 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 {} +
awk
каждый поддерживает все символы, но обратная косая черта (который является, почему я используюENVIRON
в решении я дал). Обратите внимание, что это - пути банки, о которых мы говорим здесь, не пути к классам. – Stéphane Chazelas 21.05.2013, 09:35