特定のファイルを検索し、そのディレクトリに変更します。

特定のファイルを検索し、そのディレクトリに変更します。

特定のファイルを含むディレクトリに移動する最良の方法は何ですか? (検索したいルートから始まるとします)。私はシグウィンを使用しています。

解決策:私の最終的な解決策は、これを.bashrcファイルに入れることでした。

jump2_func() {
cd "$(find . -name $1 -printf %h -quit 2>/dev/null)"
}

alias jump2=jump2_func

答え1

2つの部分:ファイルを見つけ、見つかったファイルのディレクトリに変更します。

ファイルを探す

システムのファイル階層のどこかでファイル名を見つけるには、次の2つの方法がすぐに浮かびます。

  1. 使用find
  2. 使用locate

ファイルを検索するには、次のコマンドを使用しますfind

$ find / -type f -name "filename" -print

これは、ルート()から下にファイルシステム全体をナビゲート/し、という名前のすべての一般ファイルのフルパスを印刷しますfilename/検索したいディレクトリパスに変更します。

ファイルを見つけるには、次のようにしますlocate

$ locate -r -b '^filename$'

これにより、名前が付けられたすべてのファイル(およびディレクトリなど)へのすべてのパスが出力されますfilename。これは一般的にたくさんを使用するよりも高速ですfind。ここでは、ファイル名全体を一致させるために正規表現を使用しています。そうしないと、search-rなどの結果が生じる可能性があります。このオプションは、パスの「デフォルト名」、つまり各パスの末尾にある実際のファイル名とのみ一致します。file3file-blocate

Cygwinで使用するには、locateまず「locateデータベース」を初期化する必要があります。以下を実行してこれを実行できます。

$ updatedb

欠点は、locate実行時に存在するファイルの場所だけを知っていることです。これがほとんどのUnixシステムが通常(またはそれに対応するコマンド)をupdatedb定期的にlocate実行する理由です(Cygwinでは使用できないと思います)。一部のLinuxでは1日1回、OpenBSDではデフォルトで週に1回実行されます。updatedbcron

見つかったファイルのディレクトリに変更

これらのメソッドのどれも戻り値だけを保証しないので、一つファイルパスがある場合は、作業ディレクトリを見つけたファイルのディレクトリに変更する安定した方法を考えることは困難です(複数の犬がいる場合はどちらを選択する必要がありますか?)。

選びたいとしましょう最初結果:

cd "$( dirname "$(somecommand | head -n 1)" )"

ここまたは上記のようsomecommandに。findlocate

head -n 1リストの最初の結果が選択され、dirnameファイルを含むディレクトリへのパスのみが抽出されます。 cd次に、作業ディレクトリをそのディレクトリに変更します。

参考にしてlocateお使いください

答え2

cd "$(find . -name filename -printf %h -quit 2>/dev/null)"

その名前のファイルが存在しない場合は、cdホームディレクトリが変更されます。これが望まない場合は、次のようなものが必要です。

dir="$(find . -name filename -printf %h -quit 2>/dev/null)"
test -d "$dir" && cd "$dir"

関連情報