管道脚本输出到终端以过滤行

管道脚本输出到终端以过滤行
#!/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 的命令。

相关内容