find
디렉토리 트리를 검색하는 데 GNU에 해당하는 명령이나 옵션이 있습니까 ? 트리에서 거꾸로 주어진 이름을 가진 파일을 찾고 싶습니다. 예를 들어, 내가 /usr/local/share/bin에 있고 이라는 파일을 검색하려고 한다고 가정해 보겠습니다 foo
. 이상적으로는 명령이 다음 순서로 파일을 찾도록 하고 싶습니다.
- /usr/local/share/bin/foo
- /usr/local/share/foo
- /usr/로컬/foo
- /usr/foo
- /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