$ find -exec cd =>エラーが発生しました:=> find: 'cd':そのファイルまたはディレクトリはありません。

$ find -exec cd =>エラーが発生しました:=> find: 'cd':そのファイルまたはディレクトリはありません。

このコマンドを実行すると動作します。

$ find . -inum 888696 -exec ls '{}' \;
Conversation.pst  Outlook Data File  Outlook Data File.sbd  Trash      Unsent Messages
Inbox.pst     Outlook Data File.msf  Sent.pst       Trash.msf  Unsent Messages.msf

しかし、lsそれをcd置き換えるときいいえ働く:

$ find . -inum 888696 -exec cd '{}' \;
find: ‘cd’: No such file or directory

私はcdそれがbash組み込まれていることを知っているので、これを試しました。いいえ働く:

$ find . -inum 888696 -exec builtin cd '{}' \;
find: ‘builtin’: No such file or directory

cdコマンドで使用する方法はfind -exec


修正する

cd私がwithを使用したい理由find -execは、ディレクトリ名が奇妙なので、私の端末に????

答え1

-execfindいくつかのコマンドラインオプションと他のパラメータを使用して外部ユーティリティを実行するオプション。

Unixはcd外部ユーティリティを提供せず、組み込みシェルとしてのみ提供されるため、find実行できません。少なくともmacOSとSolarisするcd外部ユーティリティとして提供されます。

見つかったパス名が入ることができるディレクトリであるかどうかをcdテストする方法を除いて、この方法はほとんど役に立ちません。対話型シェル(または呼び出されるすべての項目)の作業ディレクトリは、とにかく変更されません。findcdfind

関連:


奇妙な、または入力するのが非常に難しいディレクトリ名に問題があり、そのディレクトリに変更したい場合は、ディレクトリへのシンボリックリンクを作成してから、そのリンクを使用してcdディレクトリに入ることを検討してください。

find . -inum 888696 -exec ln -s {} thedir ';'

thedirこれにより、問題のディレクトリを指すシンボリックリンクが作成されます。その後、次のコマンドを使用して作業ディレクトリを変更できます。

cd thedir

(リンクが現在のディレクトリに存在する場合)これにより、どのような方法でもディレクトリが変更されるのを防ぎます。別のアイデアは、同様の方法でディレクトリの名前を変更することですfind。ただし、他のプログラムでディレクトリが特定の名前を持つことを期待している場合はお勧めできません。

答え2

findコマンド自体を実行すると、-execシェルは含まれません。それでも、ディレクトリへの変更はシェルが終了するまでのみ続きますcd

cdファイル名を入力するには、現在のシェルにファイル名を送信する必要があります。ファイル名がどれだけ間違っているかに応じて、コマンド置換を使用できます。

cd "$(find . -inum 888696)"

コマンド置換が末尾の改行文字を食べるため、ファイル名が改行文字で終わる場合は機能しません。この場合、find印刷時に改行を保護し、追加された行を削除する必要があります。

dir=$(find . -inum 888696; echo x)
cd "${dir%?x}"

または、GNUを使用してfind末尾の改行を印刷しないようにします(ただし、ファイル名の改行はまだ保護されています)。

dir=$(find . -inum 888696 -printf "%px" -quit)
cd "${dir%x}"

また、-quit述語(また、GNU拡張)を使用して最適化として最初の一致に集中しないでください。

または、内から新しいシェルを起動できますが、findこれは少し見苦しくなります。

find . -inum 888696 -exec bash -c 'cd "$1" && exec bash' sh {} \;

答え3

execでは動作しませんが、これで十分です。

cd "$(find . -inum 888696 -type d)"

確実にするために「-type d」を使用します。何については、私は本当に知らない。

答え4

このメッセージを受け取った場合オペレーティングシステムのプラットフォームに問題があります。POSIX標準では、名前付きコマンドをcd渡すにはファイルシステムで利用可能である必要がありますexec()

今悪いニュースがあります。

OSプラットフォームにバグがなくても警告は表示されませんが、別のプログラムが現在の作業ディレクトリを変更してすぐにシャットダウンした場合には役に立たないため、期待した結果は得られません。

cd実行されたコマンドを有効にするには、find次のようにします。

find . -type d -exec sh -c 'cd "$1"; some other command' dummy {} \;

関連情報