![管道脚本输出到终端以过滤行](https://linux22.com/image/922777/%E7%AE%A1%E9%81%93%E8%84%9A%E6%9C%AC%E8%BE%93%E5%87%BA%E5%88%B0%E7%BB%88%E7%AB%AF%E4%BB%A5%E8%BF%87%E6%BB%A4%E8%A1%8C.png)
#!/bin/bash
for f in *.{jpg,png,webm,mp4}; do mv "$f" "$(sed 's/[^0-9A-Za-z_.]/_/g' <<< "$f>; done
当前使用此脚本来转换该扩展名的所有指定文件并删除其特殊字符,但我想知道是否可以通过管道传输它并过滤无用的输出(即由于没有特殊字符而跳过文件的警告)。
我知道我可以用> /dev/null 2>&1
它丢弃所有东西,但是是否可以只过滤与模式/关键字匹配的特定输出,然后从输出中仅删除那些行?或者,相反,只过滤与模式/字符串匹配的行。
答案1
您可以使用更具体的 shell glob 进行文件选择 - 并在参数扩展中使用相同的 glob(完全避免调用sed
)。例如。
#!/bin/bash
shopt -s nullglob globasciiranges
for f in *[^0-9A-Za-z_.]*.{jpg,png,webm,mp4}; do
echo mv -n -- "$f" "${f//[^0-9A-Za-z_.]/_}"
done
(该globasciiranges
选项是为了避免整理顺序出现意外)。
rename
不过,您可能想看看基于 Perl 的命令。