ディレクトリを変更したときにワイルドカード*が機能しないのはなぜですか?

ディレクトリを変更したときにワイルドカード*が機能しないのはなぜですか?

たとえば、私のディレクトリには次のものがあります。

/home/myname

それからCDを別のディレクトリに入れたいです。

/home/pulsar/... 

別のディレクトリにドリルダウンする必要がありますが、行全体を入力せずにこれを行うにはどうすればよいですか?頑張った

cd */thedirectoryiwanttogointo

しかし、これはうまくいきません。完全な行を入力する必要があります。

答え1

次の理由でワイルドカードが機能しない可能性があります。

  • 指定した場所にワイルドカードと一致するコンテンツはありません。
  • 1つ以上のゲーム。

(シェルから)サブディレクトリ間を頻繁に移動する一般的な方法は、とCDPATH一緒にこの機能を使用することです。 pushdpopd

このCDPATH機能(おそらくtcshで最初に登場したでしょう)は、コロンで区切られたディレクトリのリストです。名前の親がthedirectoryiwanttogointo非常にユニークな場合は、リストに親を追加できます。

もっと読むには(シェルのマニュアルページが最初に来る必要があります):

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最初のディレクトリ(指定された順序なし)に移動します。foobar

答え3

ワイルドカード拡張を使用して、システムのどこからでもパスを探したいと思います。モードを正しく指定すると、次のことができます。

cd /**/thedirectoryiwanttogointo

デフォルトではzshとFishで動作します。Bashで初めてこれを行う場合shopt -s globstar、存在するtcsh 場合set globstar、ksh93でset -o globstaryashもし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に固有のものですが、ほとんどの最新のシェルには同様の機能があると思います。

関連情報