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

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

Есть модуль узла, который, похоже, выполняет именно то, что я хочу , но я не хочу зависеть от установки 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 
  • Скрипт для изменения времени изменения файлов и каталогов рекурсивно
  • Shell command / script, чтобы узнать, жив ли хост?
  • задать путь библиотеки для текущего скрипта
  • Почему функция не возвращается, пока фоновый процесс не завершится?
  • Сценарий оболочки `rm -r`: переадресовать запрос с защитой от записи и ответить« n »
  • Удалить все файлы в каталоге
  • поиск и увеличение значений между символом второй тильды и символом третьей тильды в каждой строке файла txt
  • Запуск сценария в качестве опции загрузки Grub
  • Как удалить двойные кавычки из файла, но не внутри двойных кавычек
  • Как иметь дело с пробелами в переменной
  • автоматизация конфигурации CentOS 7 с использованием сценариев оболочки
  • Linux и Unix - лучшая ОС в мире.