Bash 跳过循环中名称中已包含FINAL的文件
我想将编解码器H264更改为H265,其中包含H264的归档文件的格式如下: 归档文件.mp4 一旦更改,归档文件将采用以下格式: archiveFINAL.mp4 这是我的代码: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
#!/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 ....