Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 带子文件夹的ffmpeg批重新编码_Bash_Batch File_Ffmpeg_Re Encoding - Fatal编程技术网

Bash 带子文件夹的ffmpeg批重新编码

Bash 带子文件夹的ffmpeg批重新编码,bash,batch-file,ffmpeg,re-encoding,Bash,Batch File,Ffmpeg,Re Encoding,我正在尝试将几百个视频重新编码到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 out

我正在尝试将几百个视频重新编码到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)
#/bin/bash
inputdir=$PWD
outputdir=$PWD
而IFS=read-r文件;做
视频=`basename“$file”`
dir=`dirname“$file”`
ffmpeg-fflags+genpts-i“$文件”-c:v libx265-c:a副本“$dir”/X265\$视频”

完成<这是和的典型场景

其中
-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
不带任何内容的意思与“for all arguments gived”相同,这是由xargs传递的文件


要使用字符串作为文件名的前缀,必须将文件名拆分为目录和基本部分,然后再将其放在一起。

使用
xargs
+
sh-c
,还可以通过将
-I
变量––在本例中为
文件
--to
sh-c
传递到
中,作为位置参数使用bourne脚本替换,以作为
$1
扩展:

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

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

感谢Olaf,这看起来是一个很好的解决方案,但我遇到了一个错误,当它转到第一个目录时,它试图将X265_u前置到目录名。我收到以下错误:
X265./Sub-Directory/File with Spaces.avi:没有这样的文件或目录
@Alan这可能无法正常工作。也许它需要一些引号和转义,但我现在不在电脑前测试它。谢谢@Olaf,你所做的编辑非常完美。
find . -name '*.flac' -print0 | \
xargs -0 -I FILE \
sh -c 'ffmpeg -i "$1" -c:a libfdk_aac -vbr 3 "${1%.flac}.m4a"' -- FILE