2

我正在尝试将几百个视频重新编码为 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 - 批量转换子文件夹

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 的正确解决方案,我将不胜感激。

4

2 回答 2

2

这是一个典型的find场景xargs

find /path/to/basedir -name '*.avi' -print0 | xargs -0 convert.sh

where-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没有任何东西的意思与“给定的所有参数”相同,它们是 xargs 传递的文件。

要在文件名前加上一个字符串,您必须将名称拆分为目录和基本部分,然后再将它们放在一起。

于 2016-10-04T21:32:37.573 回答
0

使用xargs+ sh -c,也可以通过传递-I变量来使用 bourne 脚本替换——在这种情况下FILE——tosh -c作为位置参数,用作$1扩展:

find . -name '*.flac' -print0 | \
xargs -0 -I FILE \
sh -c 'ffmpeg -i "$1" -c:a libfdk_aac -vbr 3 "${1%.flac}.m4a"' -- FILE

在这里,我只是将 .flac 扩展名去掉${1%.flac}并添加 m4a。

于 2018-07-22T08:59:55.097 回答