将 3 个单独的命令合并为一个命令,用于重新编码视频、提取缩略图、删除原始视频以及在子目录中重命名新视频

2023-12-01

我正在尝试执行 find bash 命令来处理数百个视频文件,这些文件全部命名为video-original.mp4但位于父目录的子目录中。

这是目录结构的示例:

videos
├── 01a
│   └── video-original.mp4
├── 01b
│   └── video-original.mp4
├── 02a
│   └── video-original.mp4
├── 02b
│   └── video-original.mp4
├── 03a
│   └── video-original.mp4
└── 03b
    └── video-original.mp4

我正在使用以下命令:

find ./ -name 'video-original.mp4' -exec bash -c 'ffmpeg -i "$0" -f mp4 -vcodec libx264 -preset veryslow -profile:v high -acodec aac -movflags faststart video.mp4 -hide_banner' {} \;

我遇到的问题是它正在保存文件video.mp4在父级中videos目录,而不是原始目录旁边的子目录video-original.mp4

之后我想删除该文件video-original.mp4。目前,我的过程需要等待所有视频重新编码,然后完成后发出单独的命令来删除文件video-original.mp4:

find ./ -name 'video-original.mp4' -exec bash -c 'rm -rf "$0"' {} \;

我的最后一步是提取新的屏幕截图video.mp410秒后保存为thumbnail.jpg。同样,我目前正在将其作为一个单独的步骤,在前两个步骤完成后执行。

find ./ -name 'video.mp4' -exec bash -c 'ffmpeg -i "$0" -ss 00:00:10 -vframes 1 thumbnail.jpg' {} \;

我想做的是将这三个步骤组合成一个命令,因此最终结果将是:

videos
├── 01a
│   ├── thumbnail.jpg
│   └── video.mp4
├── 01b
│   ├── thumbnail.jpg
│   └── video.mp4
├── 02a
│   ├── thumbnail.jpg
│   └── video.mp4
├── 02b
│   ├── thumbnail.jpg
│   └── video.mp4
├── 03a
│   ├── thumbnail.jpg
│   └── video.mp4
└── 03b
    ├── thumbnail.jpg
    └── video.mp4

最后,最好将其保存为 bash 脚本并将其包含在我的路径中/usr/local/bin or ~/bin作为可执行文件,这样我就可以发出命令reencode它会运行。如果输入文件可以有任何视频文件就更好了,例如,random_name.mp4 or random_name.mov or random_name.webm,基本上任何视频文件(但跳过video.mp4在编码步骤)。


我相信可能有两个问题,一是路径./- 所以也许尝试使用:

find . -name ...

否则路径将被翻译为.//file,这似乎不正确。

下一个问题是,由于您正在运行find来自父目录的命令任何调用的内容-exec将在那里输出。相反,我们想要使用-execdir因为这将处理它找到的文件目录中的所有内容。既然你想用它创建一个命令,我们将把它变成一个 bash 函数,然后你可以将你添加到~/.bash_profile或者您喜欢设置环境的任何地方。

encode () { export target=$2 ; find . -name "*$1*" \
! -name "$target" -execdir bash -c 'ffmpeg -i "$0" -f mp4 -vcodec libx264 \
-preset veryslow -profile:v high -acodec aac -movflags faststart "$target" \
-hide_banner -ss 00:00:10 -vframes 1 thumbnail.jpg' {} \; \
-execdir bash -c 'rm -f "$0"' {} \; ; }

基本上,它的作用是包裹整个findbash 函数中的命令,您可以从命令行调用该命令(一旦添加到您的配置文件等):

$ encode mp4 video.mp4
          |      |
          |      |___ target file (encode will also skip this file)
          |
          |___ recursively encode files matching this extension

总而言之,encode函数包装了find命令,该命令反过来递归搜索与您选择作为参数一的扩展名匹配的任何文件。这target(arg 2) 是要保存的文件名或输出文件。编码完成后,原始文件target被编码被删除。如果文件与您选择的扩展名匹配并且与该文件位于同一目录中target那么匹配的文件将被编码到target文件(覆盖它);不管怎样target文件总是被跳过并且从不编码。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 3 个单独的命令合并为一个命令,用于重新编码视频、提取缩略图、删除原始视频以及在子目录中重命名新视频 的相关文章

随机推荐