Изменение глубины поиска при поиске каталогов

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

Например, я использую find для поиска рекурсивно для файлов .txt в текущем каталоге. Затем показываются только каталоги, содержащие такие файлы.

 find . -name "*.txt" -printf '%h\n' 

выходы на (например)

 ./out/data ./out/data ./output/data 

Итак, я хотел бы улучшить использование find для:

  1. не показывает повторяющиеся dirs (я думаю, это происходит потому, что в нем есть 2. .txt файл)

  2. Я бы хотел напечатать только первый уровень, то есть только ./out/ и ./output/

  • Почему поиск выглядит в текущем каталоге?
  • Установка разрешений на основе прав пользователя
  • Как использовать регулярное выражение внутри exec с помощью find?
  • Удалите файлы и каталоги по их именам. Данный файл или каталог отсутствует
  • Как я могу переименовать все файлы с одним расширением на другое расширение рекурсивно
  • Поиск файла, который создал X минут назад (без поиска GNU / BSD)
  • Как обновить кэш Linux «локализовать»
  • Перемещение последних файлов из одного каталога в другой
  • 3 Solutions collect form web for “Изменение глубины поиска при поиске каталогов”

    Там может быть более ориентированный подход, но вы можете сделать это с помощью нескольких других инструментов, помогающих:

     find . -name '*.txt' -printf '%h\n' | cut -f1,2 -d/ | sort -u 

    Или я думаю, мы могли бы сохранить процесс и использовать awk как

     find . -name '*.txt' -printf '%h\n' | awk -F/ '{matched[$1"/"$2]=1} END {for(dir in matched) {print dir}}' 

    почему бы не передать результат другим инструментам для дальнейшей обработки, например:

     find . -name "*.txt" -printf '%h\n'| sort | uniq | cut -d'/' -f1,2 

    Используйте sed чтобы сохранить только первое имя каталога в пути, а затем sort и сохранять только первую строку с равным пробегом:

     find . -name "*.txt" -printf '%h\n' | sed -e 's#^\(\./[^/]*\).*#\1#' | sort -u 
    Linux и Unix - лучшая ОС в мире.