web-dev-qa-db-ja.com

「上向き」の発見はありますか?

私は間違ったstackexchangeサイトで この質問 を尋ねたことがわかりました。

特定のパスから始まるファイルを見つけるには、find <path> ...を使用できます。 'upwards'を検索したい場合、つまり親ディレクトリにあり、それが親であり、...、同等のツールはありますか?

ユースケースは、たとえばで使用するドットの正しい数(../../x.txtまたは../../../x.txt?)を知っていることです。上流のどこかにいくつかの一般的なmakefile関数を含むmakefile。

次のようなフォルダ構造の使用目的:

/
/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
$ 

つまり、要するに:

  • このフォルダで検索する必要があります、それは親です、それは親の親です...
  • しかし、それらの兄弟のいずれにもありません(「find」のように)
  • 現在のパスに関連して見つかったファイルを報告する必要があります
12
xtofl

この簡単なスクリプトを使用できます。ディレクトリツリーを上に移動し、指定されたファイルを検索します。

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

使用法:

upfind -name 'x*'
18
choroba

パスを構成するディレクトリノードに分割し、それぞれを慎重に検索するだけです。これは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*"...これは次の出力を生成します
when [〜#〜] yabba [〜#〜] presents // home/user/ home/user/zt

../../../YABBA
../YABBA
YABBA
1
Peter.O