web-dev-qa-db-ja.com

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

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

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

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

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

./path/to/foo.mp4

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

12
dubbelj

GNUで次を検索:

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

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

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

または:

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

ただし、ファイルごとに1つの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 {} +

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

 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ですが、他の使用法では、ファイル名が-または+で始まる(またはコマンドでオプションとして理解される)か、または=を含む(そして次のように理解される)ことを考慮する必要がありますたとえばawkによる変数割り当て)、または Perl -p/n でこの種の問題を引き起こす他の文字(GNU find./接頭辞(ただしその場合)など)を考慮する必要がある場合があります。

20