Bash脚本中使用find处理含空格与单引号的文件夹名失败
批量生成ffplay播放脚本的问题与解决方法
我用Bash 5.*编写了make-ffplay-script脚本,用来生成能播放指定文件夹内音视频文件的脚本,其核心逻辑函数如下:
ffprobe -hide_banner 2>&1 "$*" |grep Stream|grep "Video:" >/dev/null if [ $? -eq 0 ]; then # 返回0表示是视频文件,使用默认播放参数 ffplay -autoexit -hide_banner -fs -i "$*" else # 返回非0表示是音频文件,调整播放参数 ffplay -autoexit -hide_banner -showmode waves -x 500 -y 150 -i "$*" fi }
现有脚本的限制
- 能正常处理末尾带
/的文件夹名,但开头带./的文件夹名存在问题 - 仅支持相对路径,必须保证目标文件夹和生成的播放脚本在同一目录下,才能正常播放其中的文件
调用问题
手动调用时,通过单引号、双引号或转义符可以正确处理含空格或单引号的文件夹名(不存在含双引号、换行或空字节的文件夹/文件名)。但尝试用find . -type d -maxdepth 1 -mindepth 1批量获取子文件夹并传入脚本时,循环读取find结果会拆分带空格的文件夹名,导致生成的myfindloop.sh内容错误。
我期望生成的myfindloop.sh内容如下:
make-ffplay-script "testdir's space" make-ffplay-script "testdir with space" make-ffplay-script "testdir"
解决方案
感谢@pjh提供的有效方法,使用以下命令即可实现需求:
for d in */ ; do echo make-ffplay-script "$d" ; done > myfindloop.sh
也可以使用printf方法实现,生成myfindloop.sh后需要执行chmod a+x myfindloop.sh赋予执行权限。
内容的提问来源于stack exchange,提问作者Rava
相关产品推荐
相关产品推荐

