find
課題には、実際にコマンドを使用せずに非常に基本的なbashスクリプトとして機能するbashスクリプトを作成する必要がありますfind
。たとえば、次のように入力すると:
my_find ~/homedir/ -name 'test*' -name '*.o' -type f
~/homedir/
ワイルドカード名と一致するものを検索し、その結果内で名前と一致するものを検索し、最後に(おそらく重複する可能性がある)ファイルを検索するために必要です。最後に、すべての結果がリストされます。test*
AND
*.o
dirpath=$1
これまで、ディレクトリパス()を格納する変数を作成しました。次に、それを使用してshift
最初の引数を削除し、次の手順を実行します(注、-type
まだ実装されていません)。
while (($#)); do
if [[ $1 == "-name" ]]; then
# process the name here?
shift 2 # get rid of -name "name"
fi
done
これをどうやって作るのか、それともどうするのか気になります。ディレクトリパスを介して繰り返される部分的に完了した関数がありますが、渡された引数を処理する方法/場所がわかりません。これは各ディレクトリを調べる再帰関数です。
recurse_path () {
for i in "$@"; do
# process and store matching file names in the array?
if [[ -d "${i}" ]]; then
cd "${i}"
recurse_path *
fi
done
}
それでは、この機能を使用するときに一致するファイル名を検索して結果を配列に保存するにはどうすればよいですか?また、これが正しい方法ですか、それとも各コマンドを表示したときに得られた結果を更新するより簡単な方法はありますか?私はbashスクリプトに初めて触れたので、アドバイスをいただきありがとうございます。
ベストアンサー1
基本的なものを注文してみましょう。
1.
すでにディレクトリツリーを参照できる場合は、次のステップは現在アクセスしているディレクトリ内を検索することです。サポートするパターンの構文スタイルによって異なります。正規表現はまったく異なるものです。たぶん、私たちはシェルの組み込みパターン構文に満足するかもしれません。じゃあそれだ。
for i in * ; do for p in <patterns> ; do
if [[ $i == $p ]]
...
fi
done ; done
2.
コマンドラインを解析するには、bashにgetoptが組み込まれています。マニュアルを参照してください。
三。
配列については、マニュアルを参照してください。