찾기 명령은 디렉토리 트리를 찾는 데 사용됩니다.

찾기 명령은 디렉토리 트리를 찾는 데 사용됩니다.

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

관련 정보