![リバース再帰検索でファイルを見つける方法はありますか? [コピー]](https://linux33.com/image/1938/%E3%83%AA%E3%83%90%E3%83%BC%E3%82%B9%E5%86%8D%E5%B8%B0%E6%A4%9C%E7%B4%A2%E3%81%A7%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E8%A6%8B%E3%81%A4%E3%81%91%E3%82%8B%E6%96%B9%E6%B3%95%E3%81%AF%E3%81%82%E3%82%8A%E3%81%BE%E3%81%99%E3%81%8B%EF%BC%9F%20%5B%E3%82%B3%E3%83%94%E3%83%BC%5D.png)
次のようにファイル構造の深いディレクトリにあるとしましょう。
/home/cory/projects/foo/bar/bash/baz
現在、フォルダbaz
またはフォルダのいずれかにあることがわかっています。以上私(たとえば、、、、、home
またはcory
)にはファイルがありprojects
ます。追加フォルダを検索せずにファイルを見つける方法は?foo
bar
bash
happy
答え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