ファイルを見つけて、それを含むディレクトリに移動したい。私は試した find /media/storage -name "Fedora" | xargs cd
ですが、もちろん、私はis not a directory
エラー。
親ディレクトリを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
への複数の引数を防止する必要があります。
steeldriver'sソリューションに似ていますが、-execdir
(GNUやFreeBSDのfind
のようにfind
がサポートしている場合)pwd
と組み合わせて:
cd "$(find /media/storage -name "Fedora" -execdir pwd \; -quit)"
-quit
は、結果が1つしかなく、ディレクトリ全体をクロールしても問題がない場合はオプションです。 NetBSDでは-exit
およびOpenBSDには存在しません。
見つけたディレクトリで新しいシェルを実行させることができます。
exec find /media/storage -name "Fedora" -execdir "$Shell" \;
その後、現在のディレクトリはFedoraという名前のファイルを含むディレクトリになります。 ;)
明らかに、これは対話的にコマンドを入力している場合にのみ、あなたが望むものに似た何かをします。
zsh
の場合:
_cd /media/storage/**/Fedora([1]:h)
_
cd
をFedora
という名前のファイルを含む最初の(アルファベット順)ディレクトリに移動します。
**
_:任意のレベルのディレクトリ(デフォルトでは隠しディレクトリは省略されます。含めるにはD
グロブ修飾子を使用します)[1]
_:最初のみ:h
_:head修飾子:dirnameを取ります。cd "$(find ...)"
とは逆に、ディレクトリ名が改行文字で終わる場合にも機能します。もう1つの利点は、一致するディレクトリがない場合にno matchエラーメッセージが表示されることです(ほとんどのシェルでは_cd ""
_は何も通知せずに何もしません)。
欠点は、戻る前に_/media/storage
_全体をクロールすることです。