gpt4 book ai didi

bash - 在递归文件夹的批处理脚本中使用 mkdir 和 ffmpeg

转载 作者:行者123 更新时间:2023-12-04 22:51:38 27 4
gpt4 key购买 nike

我有很多带有 .mp4 文件的文件夹。我编写了一个脚本,它获取 mp4 文件并将它们转换为每帧 1 个 jpeg 图像。至关重要的是,此脚本的输出(保留的文件名,末尾附加 _frame 编号)进入一个新创建的文件夹,其文件基名为:

#!/bin/bash
for f in *.mp4; do mkdir -p "${f%.*}" && ffmpeg -i ${f} -start_number 000 "${f%.*}/${f}_%03d.jpg"; done
我可以一次为每个父文件夹运行一个,没问题,但我想只运行一次并让它递归运行。
我将代码更改为:
#!/bin/bash
for f in *.mp4/; do mkdir -p "${f%.*}" && ffmpeg -i ${f} -start_number 000 "${f%.*}/${f}_%03d.jpg"; done
并尝试使用 mkdir 部分(通过添加 ./),但无论我做什么,我都会收到以下错误。
mkdir: 无法创建目录‘*’: 无效参数
我需要做些什么来允许 mkdir 在其各自的子文件夹中创建适当的新文件夹吗?
文件结构如下:
parent folder
└── videos_1
├── videos_1_basename_1.mp4
└── videos_2_basename_2.mp4
└── videos_2
├── videos_2_basename_1.mp4
└── videos_2_basename_2.mp4
.sh script

最佳答案

您可以使用 globstar在子目录和 nullglob 中递归的 bash 选项选项,使得模式扩展为 null 而不是本身(您的错误原因在另一个答案中解释):

#!/usr/bin/env bash

shopt -s globstar nullglob
for f in **/*.mp4; do
d=${f%.mp4}
b=$(basename -s.mp4 "$f")
if mkdir -p "$d"; then
ffmpeg -i "$f" -start_number 000 "$d/${b}_%03d.jpg"
else
printf 'could not mkdir %s\n' "$d"
fi
done
注意:对于名为:
videos_1/videos_1_basename_1.mp4
这将创建名为:
videos_1/videos_1_basename_1/videos_1_basename_1_000.jpg
videos_1/videos_1_basename_1/videos_1_basename_1_001.jpg
...
如果你真的想保留 .mp4名称中的扩展名:
videos_1/videos_1_basename_1/videos_1_basename_1.mp4_000.jpg
...
只需删除 -s.mp4 basename 的选项.

关于bash - 在递归文件夹的批处理脚本中使用 mkdir 和 ffmpeg,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71560012/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com