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

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

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

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

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

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

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

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

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

  • Помогите понять синтаксис `find` на Solaris
  • Удалите файлы, которые предоставляются по каналу
  • как найти вхождения файла, используя locate
  • Использование rename для удаления '.orig' из файла и добавления '_1' в basename
  • Почему эта команда поиска не работает? Regex & Найти варианты для файлов .mp3 .wav и .m4a
  • путают о двойном цитировании
  • как выбрать файлы в каталоге с булевым оператором AND
  • Распечатайте имя файла и выполните команду по каждому результату поиска
  • 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 - лучшая ОС в мире.