如何将ls输出通过管道传给mplayer 按大小顺序播放文件夹内文件
按文件大小排序后用mplayer播放文件夹内文件的正确方法
原有命令失效原因
ls -1S folder | mplayer:mplayer默认不会从标准输入读取播放列表,传入的内容不会被识别为播放文件ls -1S folder | xargs mplayer:ls输出的是不带父目录路径的文件名,若当前工作目录不在目标文件夹内会找不到文件,同时遇到文件名含空格、换行等特殊字符时会拆分错误ls -1S folder | xargs -print0 mplayer:参数使用错误,-print0是find/ls类命令的输出参数,xargs对应的空字符读取参数为-0,二者没有配对使用
正确实现方式
简易版(仅适合文件名无空格、特殊字符的场景)
先切换到目标文件夹,再把排序后的文件名传入mplayer:
cd /path/to/your/folder && mplayer $(ls -1S)
通用稳定版(适配所有文件名含特殊字符的场景)
使用空字符分隔的数据流避免文件名解析错误,支持带空格、换行等特殊字符的文件名:
find /path/to/your/folder -maxdepth 1 -type f -printf "%s\t%p\0" | sort -z -k1nr | cut -z -f2- | xargs -0 mplayer
各部分作用说明:
find部分:仅扫描目标文件夹下的一级普通文件,输出「文件大小+制表符+完整文件路径」,每条记录用空字符分隔sort部分:按第一列的文件大小数值倒序排序,识别空字符分隔规则cut部分:移除大小字段,仅保留完整的文件路径xargs部分:把空字符分隔的路径列表作为参数传递给mplayer启动播放
如果需要递归扫描目标文件夹下所有子目录的文件,删除find命令中的-maxdepth 1参数即可。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

