繁体   English   中英

使用sed在bash脚本中进行就地重命名

[英]Using sed to do an in-place rename in bash script

我在OSX上有一个文件夹,其中有从在线DVR下载的电视节目。 我要列出程序列表并设置其格式以匹配另一个列表进行比较。

当我在shell中运行以下命令时,一切正常,我得到了想要的列表。

ls *.mp4 > loaded_shows.txt
sed -i$0 's/\(.*\)_/\1\ /' loaded_shows.txt
sed -i$0 's/\(.*\)_/\1\ /' loaded_shows.txt
sed -i$0 's/\(.*\)_/\1\ /' loaded_shows.txt
cat loaded_shows.txt

当我将相同的命令放入bash脚本中时,即使脚本与文件位于同一目录中,sed也会为每次就地替换提供以下错误消息。

sed:rename():没有这样的文件或目录

为了完整起见,这是bash脚本:

#!/bin/bash
ls *.mp4 > loaded_shows.txt
sed -i$0 's/\(.*\)_/\1\ /' loaded_shows.txt # replace last _ with space
sed -i$0 's/\(.*\)_/\1\ /' loaded_shows.txt # again replace last _ with space
sed -i$0 's/\(.*\)_/\1\ /' loaded_shows.txt # remove the file extension
cat loaded_shows.txt

以及示例输入文件名:

666_Park_Avenue_2014-04-22_23.35.mp4
Americans_2014-04-20_22.45.mp4
Scandal_2014-04-20_21.00.mp4
The_Voice_of_USA_2014-04-22_19.30.mp4

我如何在bash脚本中工作?

您已经用sed的-i选项记录了您的错误。 找到它做得很好。 :)

如果脚本中的注释表明您要实现的目标,那么我实际上将脚本重构为在管道中使用sed一次,如下所示:

#!/bin/bash

for f in *.mp4; do
  echo "$f" | sed 's/_\([^_]*\)_\([^_]*\).mp4$/ \1 \2/'
done > loaded_shows.txt

少运行sed更为经济,而仅一次打开/关闭文本文件更经济。 因为您知道,浪费一毫秒就是损失一毫秒。

我应该在这里指出for循环。 通常,当您在Shell脚本中浏览文件列表时,您想将其for而不是解析ls的输出。 解析ls是Shell脚本世界中众所周知的陷阱,最好不要让自己有这种坏习惯,即使在受控环境中的小脚本中也是如此。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM