以下はより安全なはずです:
cd -- "$(find / -name ls -type f -printf '%h' -quit)"
利点:
- 二重ダッシュは、オプションとしてハイフンで始まるディレクトリ名の解釈を防ぎます (
find
はそのようなファイル名を生成しませんが、有害ではなく、同様の構成に必要になる可能性があります) -name
-type
の前に確認してください 後者は時々stat
を必要とするのでチェックしてください- いいえ
dirname
%h
であるため必須 指定子はすでにディレクトリ名を出力しています -quit
最初のファイルが見つかった後に検索を停止するため、head
はありません 改行を含むディレクトリ名でスクリプトが失敗する原因となる必須
次のようなものを使用できます:
pax[/home/pax]> cd "$(dirname "$(find / -type f -name ls | head -1)")"
pax[/usr/bin]> _
これにより、最初の ls
が検索されます 通常のファイルをそのディレクトリに変更します。
各ビットの機能について:
- 検索は
/
から始まります 下方向に検索し、すべての通常のファイルを一覧表示します (-type f
)ls
と呼ばれる (-name ls
)。find
に追加できるものは他にもあります 取得するファイルをさらに制限します。 head -1
を通る配管 最初のもの以外はすべて除外されます。$()
コマンドの出力を取得して、別のコマンド ラインに出力する方法です。 コマンドdirname
完全なファイル仕様を取り、パスビットを与えることができます.cd
そのディレクトリに移動するだけです。
各ビットを順番に実行すると、何が起こるかがわかります:
pax[/home/pax]> find / -type f -name ls
/usr/bin/ls
pax[/home/pax]> find / -type f -name ls | head -1
/usr/bin/ls
pax[/home/pax]> dirname "$(find / -type f -name ls | head -1)"
/usr/bin
pax[/home/pax]> cd "$(dirname "$(find / -type f -name ls | head -1)")"
pax[/usr/bin]> _