以下はより安全なはずです:
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]> _