2

Если я хочу найти файл в каталоге или где-то под ним, find это очень полезная утилита. Есть ли подобная утилита, которая найдет вещи в текущем каталоге или над ним?

Например, если моя файловая система выглядит так:

/proj/
   foo/
     pom.xml
     bar/
       pom.xml
       baz/
         pom.xml
   quz/
     pom.xml

тогда find /proj/foo/bar -name pom.xml даст мне

/proj/foo/bar/pom.xml
/proj/foo/bar/baz/pom.xml

как это выводится. Я ищу команду, которая вернула бы

/proj/foo/bar/pom.xml
/proj/foo/pom.xml

(или в обратном порядке). В настоящее время я стремлюсь написать сценарий оболочки, который делает что-то вроде

while [[ $dir != / ]]
do
  check stuff
  cd ..
done

Существует ли что-то подобное?

В идеале мне бы хотелось что-то, что работает на Linux, Mac и Cygwin в любой оболочке, но что-то, что работает на подмножестве или только в bash , также полезно.

1 ответ1

0

Не проверено, но это должно быть сделано в bash (не уверен насчет других оболочек):

#!/bin/bash
oldpwd=`pwd`
ret=1

while true; do
    find `pwd` -mindepth 1 -maxdepth 1 $@

    if [ $? -eq 0 ] ; then
        ret=0
    fi

    if [ `pwd` = '/' ] ; then
        exit $ret
    else
        cd ..
    fi
done

cd $oldpwd

Как сценарий, он должен принимать регулярный синтаксис find для выражений. Он сохраняет текущий каталог, чтобы потом можно было вернуться назад, а затем зацикливает дерево каталогов, ища только элементы на этом уровне для выражения, до тех пор, пока не достигнет корневого каталога. Это напечатает все соответствующие элементы вверх по дереву, вы можете легко добавить проверку внутри цикла, чтобы поручиться, если find будет успешным, если вы просто хотите первые совпадения.

Возможно, это можно было бы немного оптимизировать, но я быстро и легко понял скорость.

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