Подтвердить что ты не робот

Как эхо-каталоги, содержащие соответствующий файл с Bash?

Я хочу написать bash script, который будет использовать список всех каталогов, содержащих определенные файлы. Я могу использовать find для повторения пути каждого соответствующего файла. Я хочу только указать путь к каталогу, содержащему хотя бы один соответствующий файл.

Например, учитывая следующую структуру каталогов:

dir1/
    matches1
    matches2
dir2/
    no-match

Команда (ищет 'matches*') выводит только путь к dir1.

В качестве дополнительного фона я использую это, чтобы найти каждый каталог, содержащий файл Java.class.

4b9b3361

Ответ 1

find -name '*.class' -printf '%h\n' | sort -u

От man find:

-printf format

%h Ведущие каталоги имен файлов (все, кроме последнего элемента). Если имя файла не содержит косой черты (поскольку оно находится в текущем каталоге) спецификатор %h расширяется до ".".

Ответ 2

В OS X и FreeBSD с find, который не имеет опции -printf, это будет работать:

find . -name *.class -print0 | xargs -0 -n1 dirname | sort --unique

-n1 в xargs устанавливает в 1 максимальное количество аргументов, взятых из стандартного ввода для каждого вызова dirname

Ответ 3

Найти GNU

find /root_path -type f -iname "*.class" -printf "%h\n" | sort -u

Ответ 4

Хорошо, я слишком поздно опоздал, но вы также можете сделать это без поиска, чтобы ответить конкретно на "соответствующий файл с Bash" (или, по крайней мере, на оболочку POSIX).

ls */*.class | while read; do
  echo ${REPLY%/*}
done | sort -u

${VARNAME%/*} разделит все после последнего / (если вы хотите удалить все после первого, это было бы ${VARNAME%%/*}).

С уважением.

Ответ 5

find / -name *.class -printf '%h\n' | sort --unique

Ответ 6

Слишком поздно, но это может быть полезно для будущих читателей: Я лично считаю более полезным иметь список папок, напечатанных в файле, а не в Terminal (на Mac). Для этого вы можете просто вывести пути в файл, например. folders.txt, используя:

find . -name *.sql -print0 | xargs -0 -n1 dirname | sort --unique > folders.txt