求助,这样的终端脚本该如何写?

2018-03-05 18:05:35 +08:00
 KevZhi

有一个文件夹 folder,里面有若干个子文件夹(命名随机),每个子文件夹里有若干个视频文件,命名随机。 现需要在每个子文件夹内执行如下命令(使用 ffmpeg 合并视频,输出文件保存在原来的文件夹里即可),如何完成?

for f in ./*; do echo "file '$f'" >> mylist.txt;done;
ffmpeg -f concat -safe 0 -i mylist.txt -c copy output.mp4;
done

感谢各位帮助

2653 次点击
所在节点   Bash
11 条回复
KevZhi
2018-03-05 18:10:56 +08:00
就是在目录下每个子目录内执行一遍如上两行命令,跳出,在下一个子目录执行,跳出...
rwdy2008
2018-03-05 18:15:22 +08:00
cd dir
for i in `ls`;do
cd dir/$i;
执行你的命令
done
是要这样吗?
afpro
2018-03-05 18:26:37 +08:00
for d in $(ls -d */); do
ffmpeg -f concat -safe 0 -i <(ls ${d}*.mp4) -c copy ${d}output.mp4
done

这样可好?
KevZhi
2018-03-05 18:27:02 +08:00
@rwdy2008 直接在目录下执行就可以,无须对每个文件再执行一次,是这样吗?
KevZhi
2018-03-05 18:29:31 +08:00
@afpro 因为文件都没有文件名,好像出了点问题
KevZhi
2018-03-05 18:33:18 +08:00
@afpro 不对,没有拓展名。
afpro
2018-03-05 18:35:54 +08:00
不对 文件列表还要有个 file

for d in $(ls -d */); do
ffmpeg -f concat -safe 0 -i <(ls ${d}*.mp4 | xargs -I{} echo "file '{}'") -c copy ${d}output.mp4
done
afpro
2018-03-05 18:36:23 +08:00
这样? 我看你 mylist.txt 里面要 file 开头
ynyounuo
2018-03-05 18:44:02 +08:00
在最顶层 dir 执行,如果子文件夹只有视频的话,否则将 find 换成需要的文件类别和后缀。

for dir in ./* ; do (cd "$dir"; find * | sed "s/^/'/;s/$/'/;s/^/file /" > tmp.txt; ffmpeg -f concat -safe 0 -i tmp.txt -c copy output.ext); done
KevZhi
2018-03-05 19:17:20 +08:00
@ynyounuo 可以做到,谢谢,如果可以把每个输出按顺序明明的话怎么做呢?
KevZhi
2018-03-05 19:17:39 +08:00
@ynyounuo 明明——命名 或者按文件夹名命名

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/435051

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX