「parent_folder」という名前の親フォルダーに多数のサブフォルダーがあり、これらのサブフォルダーには「foo.mp4」という名前のファイルがあります。
これを行うことで、これらのファイルを簡単に見つけることができます。
mymacbook:parent_folder username$ find ./ -name "foo.mp4" -exec echo {} \;
これで、parent_folder /を基準とした各ファイルのパスが返されます
./path/to/foo.mp4
ファイル名なしでパスだけを返すにはどうすればよいですか?
GNU
で次を検索:
find . -name foo.mp4 -printf '%h\n'
他のfind
sでは、指定されたディレクトリ名に改行文字が含まれていません:
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
の./
接頭辞(ただしその場合)など)を考慮する必要がある場合があります。