
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