Как эхо-каталоги, содержащие соответствующий файл с Bash?
Я хочу написать bash script, который будет использовать список всех каталогов, содержащих определенные файлы. Я могу использовать find
для повторения пути каждого соответствующего файла. Я хочу только указать путь к каталогу, содержащему хотя бы один соответствующий файл.
Например, учитывая следующую структуру каталогов:
dir1/
matches1
matches2
dir2/
no-match
Команда (ищет 'matches*'
) выводит только путь к dir1
.
В качестве дополнительного фона я использую это, чтобы найти каждый каталог, содержащий файл Java.class.
Ответы
Ответ 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