[英]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.