8

Я обнаружил, что задал этот вопрос на неправильном сайте stackexchange.

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

В этом случае используется правильное количество точек (../../x.txt или ../../../x.txt?) использовать, например, в make-файле, включая некоторые распространенные функции make-файла, где-то вверх по течению.

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

/
/abc
/abc/dce/efg/ghi
/abc/dce/efg2


$ cd /abc/dce/efg/ghi
$ touch ../../x.txt
$ upfind . -name X*
../../x.txt
$ upfind . -name Y* || echo "not found"
not found
$ touch /abc/dce/efg2/x.txt
$ upfind . -name Y* || echo "not found"
not found
$ 

Итак, вкратце:

  • он должен искать в этой папке, это родитель, это родительский родитель ...
  • но не в любом из их братьев и сестер (как «найти» будет)
  • он должен сообщать о найденных файлах относительно текущего пути

2 ответа2

14

Вы можете использовать этот простой скрипт. Он перемещает дерево каталогов вверх и ищет указанные файлы.

#!/bin/bash
while [[ $PWD != / ]] ; do
    find "$PWD"/ -maxdepth 1 "$@"
    cd ..
done

Использование:

upfind -name 'x*'
1

Вы можете просто разделить путь на составляющие его узлы каталогов и осуществлять поиск по каждому из них осторожно. Это скрипт bash .

IFS=/; dn=($1); ct=${#dn[@]}
for((i=0; i<ct; i++)); do
  subd+=/"${dn[i]}"
  dots=$(for((j=ct-i; j>1; j--)); do printf "../"; done)
  find "$subd" -maxdepth 1 -type f -name "$2" -printf "$dots%f\n"
done

запустить upfind $HOME/zt" "Y*" ... который выдаст следующий вывод
когда YABBA существует в /, /home/user, /home/user/zt

../../../YABBA
../YABBA
YABBA

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .