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

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

内部に多くのサブフォルダーがある「parent_folder」という親フォルダーがあり、そのサブフォルダーの中には「foo.mp4」というファイルがあります。

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

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

これで、parent_folder/に基づいて各ファイルのパスを返します。

./path/to/foo.mp4

ファイル名ではなくパスのみを返すにはどうすればよいですか?

ベストアンサー1

そして、GNU次を見つけてください。

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

他の場合は、指定されたfindディレクトリ名に改行文字が含まれていません。

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

または:

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

これは、プロセスをフォークし、dirname各ファイルに対してコマンドを実行することを意味します。

そのコマンドを実行する必要がある場合は、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 {} +

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

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

ただし、GNU実装はここでfind拡張されていますが、BSD実装はファイル名がオプションに引数として渡され、常にそうであるため、ここでは問題になりません。ただし、他の用途では以下を考慮する必要があります。ファイル名は or で始まるか (コマンドでオプションとして理解される) を含めるか (たとえば awk の変数割り当てとして理解することができます)、そうでなければ原因になることがあります。{}./filenamefilenamefeatured.mp4-+=この種の問題は以下に関連しています。perl -p/nfind(この場合でもGNUの接頭./辞ですべて固定されるわけではありません。)

おすすめ記事