特定のファイルを含むディレクトリに移動する最良の方法は何ですか? (検索したいルートから始まるとします)。私はシグウィンを使用しています。
解決策:私の最終的な解決策は、これを.bashrcファイルに入れることでした。
jump2_func() {
cd "$(find . -name $1 -printf %h -quit 2>/dev/null)"
}
alias jump2=jump2_func
答え1
2つの部分:ファイルを見つけ、見つかったファイルのディレクトリに変更します。
ファイルを探す
システムのファイル階層のどこかでファイル名を見つけるには、次の2つの方法がすぐに浮かびます。
- 使用
find
。 - 使用
locate
。
ファイルを検索するには、次のコマンドを使用しますfind
。
$ find / -type f -name "filename" -print
これは、ルート()から下にファイルシステム全体をナビゲート/
し、という名前のすべての一般ファイルのフルパスを印刷しますfilename
。/
検索したいディレクトリパスに変更します。
ファイルを見つけるには、次のようにしますlocate
。
$ locate -r -b '^filename$'
これにより、名前が付けられたすべてのファイル(およびディレクトリなど)へのすべてのパスが出力されますfilename
。これは一般的にたくさんを使用するよりも高速ですfind
。ここでは、ファイル名全体を一致させるために正規表現を使用しています。そうしないと、search-r
などの結果が生じる可能性があります。このオプションは、パスの「デフォルト名」、つまり各パスの末尾にある実際のファイル名とのみ一致します。file3
file
-b
locate
Cygwinで使用するには、locate
まず「locate
データベース」を初期化する必要があります。以下を実行してこれを実行できます。
$ updatedb
欠点は、locate
実行時に存在するファイルの場所だけを知っていることです。これがほとんどのUnixシステムが通常(またはそれに対応するコマンド)をupdatedb
定期的にlocate
実行する理由です(Cygwinでは使用できないと思います)。一部のLinuxでは1日1回、OpenBSDではデフォルトで週に1回実行されます。updatedb
cron
見つかったファイルのディレクトリに変更
これらのメソッドのどれも戻り値だけを保証しないので、一つファイルパスがある場合は、作業ディレクトリを見つけたファイルのディレクトリに変更する安定した方法を考えることは困難です(複数の犬がいる場合はどちらを選択する必要がありますか?)。
選びたいとしましょう最初結果:
cd "$( dirname "$(somecommand | head -n 1)" )"
ここまたは上記のようsomecommand
に。find
locate
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"