リバース再帰検索でファイルを見つける方法はありますか? [コピー]

リバース再帰検索でファイルを見つける方法はありますか? [コピー]

次のようにファイル構造の深いディレクトリにあるとしましょう。

/home/cory/projects/foo/bar/bash/baz

現在、フォルダbazまたはフォルダのいずれかにあることがわかっています。以上私(たとえば、、、、、homeまたはcory)にはファイルがありprojectsます。追加フォルダを検索せずにファイルを見つける方法は?foobarbashhappy

答え1

#!/bin/bash

function upsearch () {
    test / == "$PWD" && return || test -e "$1" && echo "found: " "$PWD" && return || cd .. && upsearch "$1"
}

この機能は現在のディレクトリから始まります。これは関数であり、ナビゲーション時にディレクトリを変更することに注意してください。ファイルが存在するディレクトリで停止し、そうでない場合はルートディレクトリ/に移動します。

これを関数ではなくスクリプトに変更し、ファイルがルートディレクトリにない場合は再度移動できます。

そのディレクトリに CD を移動したくない場合は、次のようにします。

upsearch () {
  local slashes=${PWD//[^\/]/}
  local directory="$PWD"
  for (( n=${#slashes}; n>0; --n ))
  do
    test -e "$directory/$1" && echo "$directory/$1" && return 
    directory="$directory/.."
  done
}

ファイルが/home/cory/にある場合、結果は/home/cory/a/b/c/../../../happyと同じです。きれいな道路が必要な場合はできることがあります。

cd "$directory"
echo "$PWD"
cd - 

成功について。

検索を通常のファイルに制限し、ディレクトリ、シンボリックリンクなどを除外するには、テストを-eではなく-fに変更できます。

答え2

-mindepth-maxdepthのオプションを表示しますfind

findディレクトリは後方に移動されませんが、通常の方向にアクセスして検索の深さを制限できます。

たとえば、

find /home /home/cory /home/cory/projects /home/cory/projects/foo /home/cory/projects/foo/bar /home/cory/projects/foo/bar/bash -maxdepth 0 -name happy -print

答え3

現在のディレクトリを保存してランダムテストを実行し、応答を返す前に元のディレクトリを復元して@user-unknownの解決策をいくつか改善しました。何でもテストできるので、より柔軟です。

また、どのくらい高いかを説明するオプションの2番目のパラメータもあります。

https://gist.github.com/1577473

#!/bin/bash

# Use this script instead of ~/.rvm/bin/rvm-prompt
# and the output of rvm-prompt will show up in your command prompt
# only if you are in a Ruby project directory.

# see http://stackoverflow.com/a/4264351/270511
# and http://unix.stackexchange.com/questions/13464/is-there-a-way-to-find-a-file-in-an-inverse-recursive-search

upsearch () {
  the_test=$1
  up_to=$2
  curdir=`pwd`
  result=1

  while [[ "`pwd`" != "$up_to" && "`pwd`" != '/' ]]; do
    if eval "[[ $the_test ]]"; then
      result=0
      break
    fi
    cd ..
  done
  cd $curdir
  return $result
}

if upsearch '-e Gemfile || ! -z "$(shopt -s nullglob; echo *.gemspec *.rb)"' ; then
  ~/.rvm/bin/rvm-prompt
fi

関連情報