検索コマンドは、ディレクトリツリーを検索するために使用されます。

検索コマンドは、ディレクトリツリーを検索するために使用されます。

findディレクトリツリーの検索にGNUに対応するコマンドまたはオプションはありますか?私はツリーで逆さまに与えられた名前のファイルを探したいと思います。たとえば、私が/usr/local/share/binにあり、というファイルを検索したいとしますfoo。理想的には、コマンドに次の順序でファイルを見つけるようにしたいと思います。

  1. /usr/local/share/bin/foo
  2. /usr/local/share/foo
  3. /usr/ローカル/foo
  4. /usr/foo
  5. /foo

findシェル関数でこのようなものを作成できることを知っていますが、私が活用できるgnuほど豊富なコマンドがあったらと思います。

答え1

以下は、findルートから現在のディレクトリまで検索し、引き続き検索しますが、その単一パスのディレクトリ内のみを探します。

find / -exec bash -c '[[ $PWD != "$1"* ]]' bash {} \; -prune -name foo -print

コマンドの最初の部分であるUntilは、-prune現在確認されているパス名がそのパスにあるかどうかを決定します$PWD。現在のディレクトリパスにない場合は、検索パスから削除されます。

比較は非常にbash現在のディレクトリが$PWD現在のパス名の先頭に一致するかどうかをテストするための短いスクリプト。

次のビットは、検査中のファイル名-pruneと一致しようとします。foo

bin例: 現在私がいるディレクトリ構造のどこかで名前付きエントリを探そうとします。

$ pwd
/home/kk/local/build/ast/build/src/cmd/ksh93/sh
$ find / -exec bash -c '[[ $PWD/ != "${1%/}/"* ]]' bash {} \; -prune -name bin -print
/bin
/home/kk/local/bin
/home/kk/local/build/ast/bin

$PWDインラインスクリプトの値を操作することで、$1$1見つかった項目に応じてfind)起動時にディレクトリコンポーネント全体として検出され、$PWDプレフィックス文字列だけでなく(/home/matたとえば、次のものと混同しないように)/home/matthew


bashクイックスタートシェルがある場合とないシステムではsh

find / -exec sh -c 'case $PWD/ in ("${1%/}/"*) exit 1; esac' sh {} \; -prune -name bin -print

答え2

find_backwards () {
  test $# -ne 1 && return 2
  if [ -z "$find_backwards_recurse" ]; then
    pushd . &>/dev/null
    find_backwards_recurse=yes
  fi
  if [ -f "$1" ]; then
    echo "${PWD}/${1}"
    popd &>/dev/null
    find_backwards_recurse=
    return 0
  else
    if [ / != "$PWD" ]; then
      cd ..
      find_backwards "$1"
    else
      popd &>/dev/null
      find_backwards_recurse=
      return 1
    fi
  fi
}

start cmd:> pwd
/home/hl/tmp/tmp

start cmd:> find_backwards foo
/home/hl/tmp/foo

答え3

誰がそのようなことをするのか分からない。

可能なスクリプトの実装。
探す:

#!/bin/bash
d=$1
[[ -f  "$d/$2" ]] && echo  "$d/$2" 
until  [[ ${d%%*/*} ]] || [[ -z  "$d"  ]]
do
   d=${d%/*}
   [[ -f  "$d/$2" ]] && echo  "$d/$2" 
done  

使用法rfind path filename

答え4

ディレクトリパスをたどります

f=/home/bu5hman/test; file=${f##*/}; base=${f%/*}
while [ ! -z $base ]; do
    find $base -maxdepth 1 -name $file
    base=${base%/*}
done

関連情報