sed无法在字符串后添加换行?大量PNG用ls还是find更合适?
问题解决:sed添加换行失败及ls vs find处理大量PNG
一、修复sed无法添加换行的问题
你当前的sed命令中,直接在单引号内换行的写法因shell或sed版本差异未生效。要实现每行处理后添加空行,推荐以下几种可靠写法:
方法1:用sed的a命令追加空行
a命令可在目标行后追加内容,这里直接追加空行即可:
ls ${blocks}/*.png | sed 's/^//;a\' > ${blocks}/out
注:a\后直接换行(bash中也可写为a$'\n'),表示插入一个空行。
方法2:替换字符串中插入换行(分sed版本)
- GNU sed(Linux默认):直接在替换末尾写
\n即可:ls ${blocks}/*.png | sed 's/^/\n/' > ${blocks}/out - BSD sed(macOS默认):需要用
\加实际换行:ls ${blocks}/*.png | sed 's/^/\ /' > ${blocks}/out
方法3:借助shell的ANSI-C转义
在bash/zsh等支持ANSI-C转义的shell中,用$'\n'让shell解析换行符:
ls ${blocks}/*.png | sed 's/^/'"$'\n'"'/' > ${blocks}/out
二、处理大量PNG时,find比ls更合适
是的,当文件夹内PNG文件数量较多时,find是更优的选择,原因如下:
- 规避参数过长错误:
${blocks}/*.png会被shell展开为所有匹配文件名,一旦数量超出系统ARG_MAX限制,ls会直接报错。而find直接遍历目录,不会触发这个问题。 - 兼容特殊文件名:如果文件名包含空格、换行或特殊符号,
ls的输出会出现解析混乱,find配合-print0和xargs -0可安全处理这类场景:find ${blocks} -maxdepth 1 -type f -name "*.png" -print0 | xargs -0 sed 's/^//;a\' > ${blocks}/out - 功能更灵活:find支持通过
-maxdepth限制遍历深度(避免递归子目录)、-mtime筛选修改时间等,比ls的匹配能力更强。
内容的提问来源于stack exchange,提问作者James Starlight
相关产品推荐
相关产品推荐

