bash find:見つかったファイルのディレクトリを取得します


12

「parent_folder」という名前の親フォルダーに多数のサブフォルダーがあり、これらのサブフォルダーには「foo.mp4」という名前のファイルがあります。

これを行うことで、これらのファイルを簡単に見つけることができます。

mymacbook:parent_folder username$ find ./ -name "foo.mp4" -exec echo {} \;

これで、parent_folder /を基準とした各ファイルのパスが返されます。

./path/to/foo.mp4

ファイル名なしでパスだけを返すにはどうすればよいですか?


1
man findACTIONS):-printf %h ファイル名の先頭ディレクトリ(最後の要素を除くすべて)。ファイル名にスラッシュが含まれていない場合(現在のディレクトリにあるため)、%h指定子は "。"に展開されます。
Costas、2015年

その例を示してもらえますか?それを「-exec」またはそれより前に置くべきですか?
dubbelj 2015年

find ./ -name "foo.mp4" -printf "%h\n"見つかった各ファイルのパスを出力します(1行ずつ)。さらに、いつものように誰も使用しないため-exec echo {}-print(デフォルトでは省略されている)またはprintfアクションがあります。
Costas、2015年

2
@Costas -printfはGNUのみです。OPはOS / X(BSDシステム)について言及しています。
ステファンChazelas

@StéphaneChazelasありがとう。OS / X(BSD)のそのような制限を知りませんでした。貧しいマックのユーザー!
Costas、2015年

回答:


20

GNU検索:

 find . -name foo.mp4 -printf '%h\n'

findのを使用すると、指定されたディレクトリ名に改行文字が含まれません。

 find . -name foo.mp4 | sed 's|/[^/]*$||'

または:

 find . -name foo.mp4 -exec dirname {} \;

ただし、これはdirnameファイルごとに1 つのコマンドを実行することを意味します。

その上でコマンドを実行する必要があるpath場合は、行うことができます(標準構文):

 find . -name "featured.mp4" -exec sh -c '
   for file do
     dir=${file%/*}
     ffmpeg -i "$file" -c:v libvpx -b:v 1M -c:a libvorbis "$dir" featured.webm
   done' sh {} +

この場合-execdirでも、ファイルのディレクトリにfindある(GNUでも利用可能なBSD拡張)を使用できる場合がchdir()あります。

 find . -name "featured.mp4" -execdir \
   ffmpeg -i {} -c:v libvpx -b:v 1M -c:a libvorbis . featured.webm \;

ただし、GNUの実装はここにfind拡張さ{}./filenameますが、BSDの実装はに拡張されますfilename。ファイル名はオプションの引数として渡されfeatured.mp4、常にとにかく、ここでは問題ありませんが、他の用途では、ファイル名が-orで始まる+(およびコマンドのオプションとして理解される)か、=(そして、例えばawkによる変数割り当てとして理解される)、またはこの種の問題をperl -p/n引き起こす他の文字(それらのすべてはGNU find./接頭辞によって修正されるわけではない)など、これを考慮する必要があるかもしれない。


適用するfind .と、dirnameとして使用できます。パス全体ではなく。
PersianGulf 2015年

これをどのようにこれに変換しますか?find ./ -name "featured.mp4" -exec ffmpeg -i "{}" -c:v libvpx -b:v 1M -c:a libvorbis [NEED DIRECTORY HERE] featured.webm \; あなたが言及した2番目の提案を使用しています。
dubbelj 2015年

@ MohsenPahlevanzadeh、OPは絶対パスを要求しませんでしたが、パスのdirnameを要求しました。
ステファンChazelas

@StéphaneChazelas投票して申し訳ありません。
PersianGulf 2015年

@StéphaneChazelasに感謝します。あなたは私がffmpegキュー/バッチを作成するのを手伝いました
dubbelj 2015年

-1

以下のコマンドを使用して、ディレクトリの詳細のみを取得することもできます。

find ./ -name "foo.mp4" | rev | cut -d"/" -f2- | rev

文字列をトリムするためだけに3つの外部ユーティリティを呼び出すのは少し過剰に思えます。
クサラナンダ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.