Найти определенный файл в ближайшем предке текущего рабочего каталога

Я хотел бы найти способ найти данный файл, глядя вверх в структуру каталогов, а не рекурсивный поиск через дочерние каталоги.

Есть модуль узла, который, похоже, выполняет именно то, что я хочу , но я не хочу зависеть от установки JavaScript или пакетов, подобных этому. Есть ли команда оболочки для этого? Способ сделать это? Или стандартный подход, который я просто не смог найти через Гуглинг?

3 Solutions collect form web for “Найти определенный файл в ближайшем предке текущего рабочего каталога”

Простой цикл проверки текущего каталога, и если он не найден, отключите последний компонент

 #!/bin/bash wantfile="$1" dir=$(realpath .) found="" while [ -z "$found" -a -n "$dir" ] do if [ -e "$dir/$wantfile" ] then found="$dir/$wantfile" fi dir=${dir%/*} done if [ -z "$found" ] then echo Can not find: $wantfile else echo Found: $found fi 

Например, если это дерево каталогов:

 $ find /tmp/A /tmp/A /tmp/A/good /tmp/A/good/show /tmp/A/good/show/this /tmp/A/B /tmp/A/B/C /tmp/A/B/C/thefile /tmp/A/B/C/D /tmp/A/B/C/D/E /tmp/A/B/C/D/E/F /tmp/A/B/C/D/E/F/srchup $ pwd /tmp/A/B/C/D/E/F $ ./srchup thefile Found: /tmp/A/B/C/thefile , $ find /tmp/A /tmp/A /tmp/A/good /tmp/A/good/show /tmp/A/good/show/this /tmp/A/B /tmp/A/B/C /tmp/A/B/C/thefile /tmp/A/B/C/D /tmp/A/B/C/D/E /tmp/A/B/C/D/E/F /tmp/A/B/C/D/E/F/srchup $ pwd /tmp/A/B/C/D/E/F $ ./srchup thefile Found: /tmp/A/B/C/thefile 

Мы видим, что поиск шел вверх по дереву, пока он не нашел то, что мы искали.

Один из способов сделать это:

 #! /bin/sh dir=$(pwd -P) while [ -n "$dir" -a ! -f "$dir/$1" ]; do dir=${dir%/*} done if [ -f "$dir/$1" ]; then printf '%s\n' "$dir/$1"; fi 

Замените pwd -P на pwd -L если вы хотите следовать символическим ссылкам вместо проверки физических каталогов.

Это прямой перевод алгоритма find-config в общих командах оболочки (проверен в bash, ksh и zsh), где я использую код возврата 0 для достижения успеха и 1 означает NULL / failure.

 function findconfig { # from: https://www.npmjs.com/package/find-config#algorithm # 1. If X/file.ext exists, return it. STOP # 2. If X/.dir/file.ext exists, return it. STOP # 3. If X has a parent directory, change X to parent. GO TO 1 # 4. Return NULL. # [ -f "$1" ] && echo "$PWD/$1" && return 0 [ -f ".dir/$1" ] && echo "$PWD/.dir/$1" && return 0 [ $PWD = "/" ] && return 1 # a subshell so that we don't affect the caller's $PWD (cd .. && findconfig "$1") } 

Пример прогона, с установкой, украденной, скопированной и расширенной от ответа Стивена Харриса :

 $ mkdir -p ~/tmp/iconoclast $ cd ~/tmp/iconoclast $ mkdir -p A/B/C/D/E/FA/good/show A/B/.dir $ touch A/good/show/this A/B/C/D/E/F/srchup A/B/C/thefile A/B/.dir/anotherfile $ cd A/B/C/D/E/F $ findconfig thefile /home/jeff/tmp/iconoclast/A/B/C/thefile $ echo $? 0 $ findconfig foobar $ echo $? 1 $ findconfig anotherfile /home/jeff/tmp/iconoclast/A/B/.dir/anotherfile $ echo $? 0 
  • Сценарий Bash работает только в режиме отладки
  • Почему я не получаю сообщение, которое не соответствует, когда я запускаю этот скрипт?
  • grep с количеством отдельных паттернов
  • Структура структуры преобразования
  • Как добавить заголовок лицензии рекурсивно для всех файлов .h и .cpp в каталоге
  • Как пропустить невосприимчивый сервер
  • Создать каталог для каждой строки в данном текстовом файле?
  • Почему мой Cygwin Bash всегда читается с терминала, когда я пытаюсь выполнить внешнюю команду?
  • Папки, созданные со сценарием, имеют неправильную измененную метку времени
  • Как перебирать каждый файл в FTP-каталоге с помощью сценария bash
  • Выход из функции bash, а не терминала
  • Interesting Posts

    Linux для просто одной задачи: смотреть YouTube

    KVM устанавливает шлюз в изолированной сети

    Легко получить конкретный столбец из вывода без sed или awk

    Заменить или изменить содержимое файла одним выстрелом

    Как я могу постоянно устанавливать разрешения на работу rw на ubuntu 16.04?

    Обнаружение, если компьютер был запущен с использованием WOL или выключателя питания

    find и exec: почему эта команда не работает?

    служебная команда: не удалось выполнить вызов метода

    Объяснение количества строк исходного кода Debian

    Какой пакет имеет GNU для Solaris?

    Письма с моего сервера напрямую отправляются на спам

    Как написать / отредактировать / обновить переменную eIi OsIndications из командной строки?

    Минимальная версия для syscall nanosleep

    Сравнение двух файлов и запись несогласованных строк вместе с несогласованными столбцами. Указание несогласованных столбцов – это моя основная проблема

    В Bash, если и если то же самое?

    Linux и Unix - лучшая ОС в мире.