UNIX: найдите файл в каталогах выше $ PWD - PullRequest
2 голосов
/ 30 сентября 2010

Я хочу найти файл с определенным именем, но искать в директориях выше текущего, а не ниже.

Я бы хотел что-то похожее на: (кроме функциональных)

$ cd /some/long/path/to/my/dir/

$ find -maxdepth -1 -name 'foo'
/some/long/path/to/foo
/some/foo

Предпочтительны сценарии оболочки или однострочные.


В ответ на несколько вопросов различие между приведенным выше примером и реальной находкой заключается в том, что поиск продолжается вверх из текущего каталога (и -maxdepth не принимает отрицательный аргумент).

Ответы [ 4 ]

6 голосов
/ 30 сентября 2011

Интересный вопрос, поэтому я попытаюсь дать интересный ответ:)

find `( CP=${PWD%/*}; while [ -n "$CP" ] ; do echo $CP; CP=${CP%/*}; done; echo / ) ` -mindepth 1 -maxdepth 1 -type f -name 'foo'

Немного сложнее, цикл while попытается сгенерировать список путей, которые являются родительскими для текущего каталога.Цикл while не сгенерирует /, поэтому я добавлю дополнительный 'echo /', чтобы охватить это.

Наконец, заключающая в себе команда "find" является довольно простым использованием.

2 голосов
/ 30 сентября 2010

Вы можете использовать Расширение параметра:

path="/some/long/path/to/my/dir"

while [ -n "$var" ]
do
  find $path -maxdepth 1 -name 'foo' 
  path="${var%/*}"
done
2 голосов
/ 30 сентября 2010

Это работает, но не так просто, как я надеялся.

FILE=foo
DIR=$PWD
while [[ $DIR != '/' ]]; do
    if [[ -e $DIR/$FILE ]]; then
        echo $DIR/$FILE
    else
        DIR=`dirname $DIR`
    fi
done
1 голос
/ 30 сентября 2010

Если вы имеете в виду исключить текущий каталог:

find / -name 'foo' ! -iwholename "$PWD*"

Если вы имеете в виду: прямые совпадения в любом каталоге в следе, это будет работать, но моего bash-fu недостаточно, чтобы легко получить списокdirs:

find  /some/ /some/long /some/long/path/ /some/long/path/to/ /some/long/path/to/my -maxdepth=1 -name='foo'

Так что все, что нам нужно, это метод, чтобы изменить /some/long/path/to/my/dir на
/some/ /some/long /some/long/path/ /some/long/path/to/ /some/long/path/to/my

...