Bash 跳过循环中名称中已包含FINAL的文件

Bash 跳过循环中名称中已包含FINAL的文件,bash,Bash,我想将编解码器H264更改为H265,其中包含H264的归档文件的格式如下: 归档文件.mp4 一旦更改,归档文件将采用以下格式: archiveFINAL.mp4 这是我的代码: #!/bin/bash find *.mp4 | while read -r file; do if [ "${file%.*}" != "${file%.*}FINAL" ]; then ffmpeg -i "${file%.*}".mp4 -c

我想将编解码器H264更改为H265,其中包含H264的归档文件的格式如下: 归档文件.mp4

一旦更改,归档文件将采用以下格式: archiveFINAL.mp4

这是我的代码:

#!/bin/bash
find *.mp4 | while read -r file; do 
if [ "${file%.*}" != "${file%.*}FINAL" ]; then
    ffmpeg -i "${file%.*}".mp4 -c:v libx265 -vtag hvc1 "${file%.*}FINAL".mp4
else
    echo "There is not archives to convert"
fi;
done
我使用archiveFINAL.mp4进行了测试,理论上,如果名称为archiveFINAL.mp4,则脚本可以工作,但不必工作。
问题在于,代码的工作方式不区分archive.mp4和archiveFINAL.mp4。如果归档文件的名称在FINAL.mp中完成,我不想这样做。您的条件可能不符合您的要求,而且看起来太复杂了

读取-r文件时查找*.mp4 |;做
如果[“${file%FINAL.mp4}”=“$file”];然后
ffmpeg-i“$file”-c:v libx265-vtag hvc1“${file%.mp4}FINAL”.mp4
其他的
echo“$文件已转换”>&2
fi
完成
我可能会使用一个
case
语句来代替,但这会尽量减少更改。如果您不熟悉
case
语法,它可能看起来很吓人

案例中的$file
*FINAL.mp4)echo“$文件已转换”>&2;;
*)ffmpeg。。。;;
以撒

顺便说一下,请注意,这将递归到子目录中;如果不需要这样做,只需对*.mp4中的文件执行
;执行

要检查文件名是否以“FINAL.mp4”结尾,您可以这样做:

echo "$file_name" | grep -Eq '.+FINAL\.mp4$'
if [ $? -eq 0 ];then
    // do what you want here
fi

使用
查找
。它是…的工具。。。找东西

find . -maxdepth 1 -type f -name '*.mp4' '!' -name '*FINAL.mp4' |
while IFS= read -r line; do
   ffmpeg -i "${file%.*}".mp4 -c:v libx265 -vtag hvc1 "${file%.*}FINAL".mp4
done

等于

find somefile.mp4 otherfile.mp4 otherfile.mp4 ....
它根本没有按预期使用
find
-
*。mp4
由shell扩展。最好将
shopt-s nullglob
与*.mp4
中的i一起使用

要查找名为
*.mp4
的所有文件,请执行
find-名称“*.mp4”
。注意引用。
-maxdepth 1
仅将找到的文件限制为当前目录。

如果echo“$file_name”| grep-Eq.+Final\.mp4$”;然后。。。。;fi
也会这样做。
find somefile.mp4 otherfile.mp4 otherfile.mp4 ....