内部に多くのサブフォルダーがある「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拡張を使用できます。find
chdir()
find . -name "featured.mp4" -execdir \
ffmpeg -i {} -c:v libvpx -b:v 1M -c:a libvorbis . featured.webm \;
ただし、GNU実装はここでfind
拡張されていますが、BSD実装はファイル名がオプションに引数として渡され、常にそうであるため、ここでは問題になりません。ただし、他の用途では以下を考慮する必要があります。ファイル名は or で始まるか (コマンドでオプションとして理解される) を含めるか (たとえば awk の変数割り当てとして理解することができます)、そうでなければ原因になることがあります。{}
./filename
filename
featured.mp4
-
+
=
この種の問題は以下に関連しています。perl -p/n
find
(この場合でもGNUの接頭./
辞ですべて固定されるわけではありません。)
答え2
以下のコマンドを使用してディレクトリの詳細のみをインポートすることもできます。
find ./ -name "foo.mp4" | rev | cut -d"/" -f2- | rev