如果我有一条路径中带有点的路径,例如:
/home/user/Documents/hello/test.testing_23-24.123/test.testing_23-24.124
ffmpeg
如果您将文件的路径作为参数传递,则可以找到该文件,但它会将路径名截断为在输出文件时在文件路径中遇到的第一个点。
例如,我得到了这个:
#!/bin/sh
src_folder=`pwd`
for filename in "${src_folder}"/*.MP4
do
ffmpeg -threads 0 -probesize 100M -analyzeduration 100M -i "${filename}" \
-c:v libx265 -preset medium -pass 1 -tune grain -x265-params "crf=28:pmode=yes" \
-c:a libmp3lame -q:a 9 -strict experimental "${filename%%.*}"_1stpass.mkv
done
输出状态:
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/home/user/Documents/hello/test.testing_23-24.123/test.testing_23-24.124/GOPR2103.MP4':
[..]
Output #0, matroska, to '/home/user/Documents/hello/test_hevc.mkv':
我们看到输出文件的文件夹路径如下:
/home/user/Documents/hello/test.testing_23-24.123/test.testing_23-24.124
ffmpeg
在遇到输出路径中的第一个点后被截断。这只发生在输出的文件名上。它还使用截断的路径作为文件名。
任何人都可以为我指出如何解决这个问题的正确方向吗?
PS:我知道一个糟糕的解决方法应该是避免使用带有点的文件夹:]
答案1
作为吉安 在评论中指出,您(无意中?)告诉 shell 从文件路径末尾删除尽可能多的字符,直到找到第一个点/句点;这就是%%
后面跟着的意思.*
。您可能打算去掉文件名的“扩展名”(例如MP4
),在这种情况下您需要使用单个%
,它表示与最短字符数。
由于您知道您正在拾取 MP4 文件,因此您可以进一步简化扩展%
,只需直接要求它去掉这 4 个字符即可。
pwd
当您唯一需要它的目的是收集当前目录中的文件名时,扩展也没什么意义。
使用更像这样的东西:
for filename in ./*.MP4
do
ffmpeg -threads 0 -probesize 100M -analyzeduration 100M \
-i "${filename}" \
-c:v libx265 -preset medium -pass 1 -tune grain -x265-params \
"crf=28:pmode=yes" -c:a libmp3lame -q:a 9 -strict experimental \
"${filename%.MP4}"_1stpass.mkv
done