我正在尝试将几百个视频重新编码为X265,但文件名中有许多目录和一些文件一样。我查看了一堆脚本,并且正在努力找到一个适用于空间和不同目录级别的脚本。
只要没有子目录,这个就可以了:
#!/bin/bash
for i in *.avi;
do
ffmpeg -i "$i" -c:v libx265 -c:a copy X265_"$i"
done
我一直在尝试使用这个bash脚本,但它失败了我猜的空白。
#!/bin/bash
inputdir=$PWD
outputdir=$PWD
while IFS= read -r file ; do
video=`basename "$file"`
dir=`dirname "$file"`
ffmpeg -fflags +genpts -i "$file" -c:v libx265 -c:a copy "$dir"/X265_"$video"
done < <(find "$inputdir" -name "*.avi" | head -100)
在这个线程上,对于Windows用户来说它看起来是一个很好的解决方案,但不是linux。 FFMPEG - Batch convert subfolders
FOR /r %%i in (*.mp4) DO ffmpeg32 -i "%%~fi" -map 0:0 -map 0:1 -map 0:1 -c:v copy -c:a:0 aac -b:a 128k -ac 2 -strict -2 -cutoff 15000 -c:a:1 copy "%%~dpni(2)%%~xi"
如果您能指出适合bash的正确解决方案,我将不胜感激。
答案 0 :(得分:2)
find /path/to/basedir -name '*.avi' -print0 | xargs -0 convert.sh
其中-print0
和-0
确保使用空格正确处理名称。
在convert.sh中,你有for循环,几乎和你的第一个脚本一样
#!/bin/bash
for i; do
d=$(dirname "$i")
b=$(basename "$i")
ffmpeg -i "$i" -c:v libx265 -c:a copy "$d/X265_$b"
done
for i
没有任何意思与&#34;相同,对于所有给出的参数&#34;,这是xargs传递的文件。
要在文件名前添加字符串,必须将名称拆分为目录和基本部分,然后再将它们放在一起。
答案 1 :(得分:0)
使用xargs
+ sh -c
,还可以通过将-I
变量传递给{{1 }}作为要用作FILE
扩展的位置参数:
sh -c
在这里,我只是用$1
切掉.flac扩展名并添加m4a。