web-dev-qa-db-ja.com

「検索」を使用してそのファイルのディレクトリに移動する方法

ファイルを見つけて、それを含むディレクトリに移動したい。私は試した find /media/storage -name "Fedora" | xargs cdですが、もちろん、私はis not a directoryエラー。

親ディレクトリを1行のコマンドで入力するにはどうすればよいですか?

11
Hrvoje T

少なくとも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への複数の引数を防止する必要があります。

14
steeldriver

steeldriver'sソリューションに似ていますが、-execdir(GNUやFreeBSDのfindのようにfindがサポートしている場合)pwdと組み合わせて:

cd "$(find /media/storage -name "Fedora" -execdir pwd \; -quit)"

-quitは、結果が1つしかなく、ディレクトリ全体をクロールしても問題がない場合はオプションです。 NetBSDでは-exitおよびOpenBSDには存在しません。

6
phk

見つけたディレクトリで新しいシェルを実行させることができます。

exec find /media/storage -name "Fedora" -execdir "$Shell" \;

その後、現在のディレクトリはFedoraという名前のファイルを含むディレクトリになります。 ;)

明らかに、これは対話的にコマンドを入力している場合にのみ、あなたが望むものに似た何かをします。

5
BenGoldberg

zshの場合:

_cd /media/storage/**/Fedora([1]:h)
_

cdFedoraという名前のファイルを含む最初の(アルファベット順)ディレクトリに移動します。

  • _**_:任意のレベルのディレクトリ(デフォルトでは隠しディレクトリは省略されます。含めるにはDグロブ修飾子を使用します)
  • _[1]_:最初のみ
  • _:h_:head修飾子:dirnameを取ります。

cd "$(find ...)"とは逆に、ディレクトリ名が改行文字で終わる場合にも機能します。もう1つの利点は、一致するディレクトリがない場合にno matchエラーメッセージが表示されることです(ほとんどのシェルでは_cd ""_は何も通知せずに何もしません)。

欠点は、戻る前に_/media/storage_全体をクロールすることです。

4