Назад | Перейти на главную страницу

есть ли находка "вверх"?

Чтобы найти файлы, начинающиеся с определенного пути, я могу использовать find <path> .... Если я хочу найти «вверх», то есть в родительском каталоге, и его родительском, и ..., есть ли эквивалентный инструмент?

Предполагаемое использование такой структуры папок:

/
/abc
/abc/dce/efg/ghi


$ cd /abc/dce/efg/ghi
$ touch ../../x.txt
$ upfind . -name X*
../../x.txt
$ upfind . -name Y*
$
x="$(pwd)"; while [ "$x" != "/" ]; do if [ -e "${x}/X.txt" ]; then echo $x; fi; x="$(dirname "$x")"; done

На основе Идея из @Womble я написал небольшой скрипт, который помогает:

#!/bin/bash
#
# rfind: finds a file in one of the parent directories

needle=$1 
current_dir=$(pwd) 
path=

while [ "$current_dir" != "$(dirname $current_dir)" ]; do 
    if [ -e "${current_dir}/$needle" ]; then 
        echo $path$needle
        exit 0
    else 
        path=../$path
        current_dir="$(dirname "$current_dir")"
    fi
done

if [ ! "$current_dir" != "$(dirname $current_dir)" ]; then
    echo "rfind: file $needle not found" >&2
    exit 1
fi

И назвал его «rfind» в моем собственном каталоге ~ / bin. Это делает свое дело:

/tmp $ mkdir -p x/y/z
/tmp $ cd x/y/z/
/tmp/x/y/z $ rfind a.txt || echo "not found."
rfind: file a.txt not found
not found.
/tmp/x/y/z $ touch ../../a.txt
/tmp/x/y/z $ rfind a.txt || echo "not found."
../../a.txt
/tmp/x/y/z $ 
/tmp/x/y/z $ cd ..
/tmp/x/y $ mkdir z2
/tmp/x/y $ cd z
/tmp/x/y/z $ touch ../z2/a.txt
/tmp/x/y/z $ rfind a.txt || echo "not found."
../../a.txt
/tmp/x/y/z $ rm ../../a.txt
/tmp/x/y/z $ rfind a.txt || echo "not found."
rfind: file a.txt not found
not found.

Если вам нужен родительский каталог файла, вы можете использовать find и -printf %h аргумент

find /abc -name X.txt -printf "%h\n"
/abc/dce
  • %час

    Ведущие каталоги имени файла (все, кроме последнего элемента). Если имя файла не содержит косой черты (поскольку оно находится в текущем каталоге), спецификатор% h заменяется на ".".

Почему бы просто не сделать нисходящую рекурсивную find из /? Оба они будут искать во всем файловом пространстве. Или вы просите ту, которая поднимается но затем не перемещается по каталогам, которые находит в этом поиске?