Чтобы найти файлы, начинающиеся с определенного пути, я могу использовать 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
из /
? Оба они будут искать во всем файловом пространстве. Или вы просите ту, которая поднимается но затем не перемещается по каталогам, которые находит в этом поиске?