Как отобразить каталоги, содержащие соответствующий файл, с помощью Bash? - PullRequest
33 голосов
/ 17 февраля 2010

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

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

dir1/
    matches1
    matches2
dir2/
    no-match

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

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

Ответы [ 6 ]

58 голосов
/ 17 февраля 2010
find -name '*.class' -printf '%h\n' | sort -u

От man find:

-printf формат

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

27 голосов
/ 15 декабря 2013

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

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

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

7 голосов
/ 17 февраля 2010

GNU найти

find /root_path -type f -iname "*.class" -printf "%h\n" | sort -u
3 голосов
/ 04 августа 2014

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

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

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

Привет.

1 голос
/ 19 июня 2017

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

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

1 голос
/ 17 февраля 2010
find / -name *.class -printf '%h\n' | sort --unique
...