ファイル名自体なしでファイルパスを取得する方法

ファイル名自体なしでファイルパスを取得する方法

私の.csvファイルを見つけて、そのディレクトリにcdしようとしています。

find Documents/notes -type f -name "*.csv" | head -1 | xsel -b

これにより、ファイルの最初のディレクトリがクリップボードにコピーされ、それを実行しようとします。

cd $(xsel -b) 

しかし、もちろん、ディレクトリではなくファイル名が含まれているので、そうすることはできません。

ファイル名を省略する方法はありますか?もっと良い方法がありますか?

答え1

bashシェルを使用して**パターンをアクティブにし(match、パス名の過去*にも到達)、パターンを展開して一致する最初のディレクトリに移動します。/Documents/notes/**/*.csvcd

shopt -s globstar
set -- Documents/notes/**/*.csv
cd "$(dirname "$1")"    # or: cd "${1%/*}"

デフォルトでは、このモードがzshすでに有効になっている場合は、次のように短縮できます。**

cd Documents/notes/**/*.csv([1]:h)

glob修飾子は、([1]:h)指定されたパターンに対して最初に一致するディレクトリ名(「パスヘッダー」と同様に「h」)を返します。(.[1]:h)パターンが通常のファイル(またはそのファイルへのシンボリックリンク)とのみ一致するようにこの修飾子を変更します。

答え2

はい、以下を使用してください(サポートfindが必要です)。-quit

dir=$(find . -name '*.csv' -print -quit)
cd "$(dirname "$dir")"

または

cd "$(dirname "$(find . -name '*.csv' -print -quit)")"

最初のゲームで壊れた。

-quit:

すぐに終了します(エラーが発生しない場合、戻り値は0です)。これは-pruneとは異なります。 -prune はディレクトリの内容をクリーンアップするためだけに適用されますが、-quit は直ちに find を停止するからです。子プロセスは引き続き実行されません。 -exec ... +または-execdir ... +で構成されているすべてのコマンドラインは、プログラムが終了する前に呼び出されます。 -quitを実行した後、コマンドラインで指定されたファイルは処理されなくなります。たとえば、-quitの一般的な用途は、必要なものを見つけてファイルシステムの検索を停止することですfind /tmp/foo /tmp/bar -print -quit/tmp/foo

関連情報