ファイルを見つけて、そのファイルを含むディレクトリに移動したいと思います。努力しましたが、find /media/storage -name "Fedora" | xargs cd
もちろんis not a directory
ミスもしました。
1行のコマンドで親ディレクトリにどのように入力できますか?
答え1
少なくともGNUがある場合は、次のようにディレクトリを取得find
できます。-printf '%h'
%h Leading directories of file's name (all but the last ele‐
ment). If the file name contains no slashes (since it is
in the current directory) the %h specifier expands to
".".
だからあなたはおそらく行うことができます
cd "$(find /media/storage -name "Fedora" -printf '%h' -quit)"
複数のファイルが一致する場合は、-quit
複数の引数を使用しないでください。cd
答え2
〜のようにスチールドライバーソリューションですが結合されています-execdir
(find
サポートしている場合(例:GNUまたはFreeBSD)):find
pwd
cd "$(find /media/storage -name "Fedora" -execdir pwd \; -quit)"
-quit
結果が1つだけで、ディレクトリ全体をクロールするのに問題がない場合はオプションです。 NetBSDには存在します-exit
が、OpenBSDには存在しません。
答え3
findが見つけたディレクトリで新しいシェルを実行するように指示できます。
exec find /media/storage -name "Fedora" -execdir "$SHELL" \;
現在のディレクトリは、Fedoraというファイルを含むディレクトリになります。 ;)
明らかに、これはインタラクティブにコマンドを入力した場合にのみ必要なものと同様のことを行います。
答え4
この問題を解決する方法と動作を取得する方法を示す多くの答えがすでにあります。しかし、最初からなぜそれが機能しないのか誰も言わなかった。
そのため、ランニングはxargs cd
機能しません。
これは、ディレクトリを変更するスクリプトを作成するのと同じ問題です。
xargs
新しいプロセスで実行する新しいプロセス/スクリプトを起動します。cd
この新しいプロセスの現在の作業ディレクトリを変更します。- 新しいプロセスが終了します。
したがって、現在存在しなくなったプロセスの現在の作業ディレクトリが変更されました。
次に、cd
組み込みコマンドを使用するシェルからそれを呼び出します。新しいプロセスを作成しません。このようにして、シェルプロセスの現在の作業ディレクトリが変更されます。
何をすべきかについては、他の回答を参照してください。