簡體   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