findで特定のファイルを見つける方法を見つけたいです。戻るサブディレクトリを再帰的に検索するのではなく、ディレクトリ構造で検索します。
一つあるノードモジュールが私が望むものを正確に実行しているようです。しかし、JavaScriptや同様のパッケージのインストールに依存したくありません。これを実行できるシェルコマンドはありますか?これを行う方法はありますかfind
?それともグーグルで見つけることができない標準的な方法ですか?
答え1
直役な内容です構成アルゴリズムの検索通常のシェルコマンド(bash、ksh、zshでテスト済み)では、成功には戻りコード0を使用し、NULL /失敗には1を使用します。
findconfig() {
# from: https://www.npmjs.com/package/find-config#algorithm
# 1. If X/file.ext exists and is a regular file, return it. STOP
# 2. If X has a parent directory, change X to parent. GO TO 1
# 3. Return NULL.
if [ -f "$1" ]; then
printf '%s\n' "${PWD%/}/$1"
elif [ "$PWD" = / ]; then
false
else
# a subshell so that we don't affect the caller's $PWD
(cd .. && findconfig "$1")
fi
}
実行例、盗まれた設定のコピーと拡張スティーブン・ハリス答え:
$ mkdir -p ~/tmp/iconoclast
$ cd ~/tmp/iconoclast
$ mkdir -p A/B/C/D/E/F A/good/show
$ touch A/good/show/this A/B/C/D/E/F/srchup A/B/C/thefile
$ cd A/B/C/D/E/F
$ findconfig thefile
/home/jeff/tmp/iconoclast/A/B/C/thefile
$ echo "$?"
0
$ findconfig foobar
$ echo "$?"
1
答え2
現在のディレクトリを確認して見つからない場合は、最後のコンポーネントを削除する単純なループが機能します。
#!/bin/bash
wantfile="$1"
dir=$(realpath .)
found=""
while [ -z "$found" -a -n "$dir" ]
do
if [ -e "$dir/$wantfile" ]
then
found="$dir/$wantfile"
fi
dir=${dir%/*}
done
if [ -z "$found" ]
then
echo Can not find: $wantfile
else
echo Found: $found
fi
たとえば、これがディレクトリツリーの場合:
$ find /tmp/A
/tmp/A
/tmp/A/good
/tmp/A/good/show
/tmp/A/good/show/this
/tmp/A/B
/tmp/A/B/C
/tmp/A/B/C/thefile
/tmp/A/B/C/D
/tmp/A/B/C/D/E
/tmp/A/B/C/D/E/F
/tmp/A/B/C/D/E/F/srchup
$ pwd
/tmp/A/B/C/D/E/F
$ ./srchup thefile
Found: /tmp/A/B/C/thefile
私たちが探しているものが見つかるまで、ツリーの上に検索が進むのを見ることができます。
答え3
1つの方法は次のとおりです。
#! /bin/sh
dir=$(pwd -P)
while [ -n "$dir" -a ! -f "$dir/$1" ]; do
dir=${dir%/*}
done
if [ -f "$dir/$1" ]; then printf '%s\n' "$dir/$1"; fi
物理ディレクトリを確認するのではなく、シンボリックリンクをたどるにはにpwd -P
置き換えます。pwd -L