たとえば、私のディレクトリには次のものがあります。
/home/myname
それからCDを別のディレクトリに入れたいです。
/home/pulsar/...
別のディレクトリにドリルダウンする必要がありますが、行全体を入力せずにこれを行うにはどうすればよいですか?頑張った
cd */thedirectoryiwanttogointo
しかし、これはうまくいきません。完全な行を入力する必要があります。
答え1
次の理由でワイルドカードが機能しない可能性があります。
- 指定した場所にワイルドカードと一致するコンテンツはありません。
- 1つ以上のゲーム。
(シェルから)サブディレクトリ間を頻繁に移動する一般的な方法は、とCDPATH
一緒にこの機能を使用することです。 pushd
popd
このCDPATH
機能(おそらくtcshで最初に登場したでしょう)は、コロンで区切られたディレクトリのリストです。名前の親がthedirectoryiwanttogointo
非常にユニークな場合は、リストに親を追加できます。
もっと読むには(シェルのマニュアルページが最初に来る必要があります):
- CDPATHとは何ですか?
- 3.4.ディレクトリの変更
cd
(Red Hat Enterprise Linux のステップバイステップガイド) - CシェルのCDPATHを変更する方法:cshとtcsh
pushd
それよりもpopd
最新CDPATH
ですが、まだ1990年代半ばにさかのぼります。これにより、現在のディレクトリを保存(スタックに「プッシュ」)し、そのコマンド中にそれを復元(スタックから「ポップ」)できますcd
。追加資料:
他のものはシェルエイリアスまたはシンボリックリンクを使用します。これはよく知られた場所に旅行するときに最も便利です。
答え2
可能なすべてのターゲットディレクトリが下にあり、/home
ディレクトリ名に改行文字がないと仮定すると、次のシェル関数を使用できます。
cds() {
cd "$(find /home -type d -name "$1" | head -n 1)"
}
$ cds thedirectoryiwanttogointo
もちろん、パフォーマンスはサブディレクトリとファイルの数/home
、オペレーティングシステムがメモリ内のすべてのツリーをキャッシュする機能があるかどうかによって大きく異なります。
GNUシステムでは、次の構文を使用して速度を上げ、ファイル名に改行を使用してより信頼性を高めます。
cds() {
cd "$(find /home -type d -name "$1" -print -quit)"
}
最初の一致が見つかると、検索は停止します。
パラメータはパターンとして扱われるため、次のことができます。
cds 'foo*bar'
たとえば、名前がで始まり、で終わるcd
最初のディレクトリ(指定された順序なし)に移動します。foo
bar
答え3
ワイルドカード拡張を使用して、システムのどこからでもパスを探したいと思います。モードを正しく指定すると、次のことができます。
cd /**/thedirectoryiwanttogointo
デフォルトではzshとFishで動作します。Bashで初めてこれを行う場合shopt -s globstar
、存在するtcsh 場合set globstar
、ksh93でset -o globstar
、yash
もしset -o extended-glob
。
/
ワイルドカードは、現在のディレクトリへの相対パスではなく、次に始まる絶対パスで使用され、**
このパターンを使用することを選択すると、必要な数のサブディレクトリに拡張されるために機能します。
これがうまくいっても、時間がかかることがあります。シェルはシステム全体で一致するファイルを検索する必要があります。より長いプレフィックスを指定すると、検索スペースをさらに削減できます。
cd /home/pulsar/**/thedirectoryiwanttogointo/
より深くドリルすると、検索する必要が少なくなります。これは時間がかからず、ディレクトリツリーがかなり希薄な場合は実際には実用的です。末尾を使用すると、/
拡張機能がディレクトリのみをターゲットにして発生する可能性があるさまざまなあいまいさを排除できます。
まだ一致する項目が複数ある場合、結果はシェルによって異なります。 BashとFishはあいまいさを無視し、最初のアルファベットの一致に切り替えます。 tcshとyashはエラーを報告します。 zshとkshはそれらを高度なディレクトリ切り替え機能の1つを使用しようとしています。おそらくエラーを報告してください。
同じディレクトリを再利用する可能性がある場合は、親ディレクトリを入力するCDPATH
$FOO
または、長いパスの代わりに使用できるシェル変数を作成する方が良いオプションになります。**
シェル変数を頻繁に使用する場合は、それを拡張と組み合わせて入力時間を大幅に短縮できます。
答え4
常に同じ深いディレクトリにアクセスする場合、簡単な解決策はそのディレクトリを指すシンボリックリンクを作成することです。
ln -s ~/foo/bar/baz/quux/etc/etc/etc/target ~/shortcut
以前にそのディレクトリにアクセスしたことがある場合は、別の解決策はCtrl-Rを押して検索したい文字のコマンド履歴を検索することです。これはbashに固有のものですが、ほとんどの最新のシェルには同様の機能があると思います。