Shell-Script

ID3tag - 從文件名中提取元數據的腳本

  • September 20, 2020

我有錄音目錄

foo - bar-202009.opus
unix - tilde-2020se.opus
stack - exchange-29328f.opus

我試圖從文件名設置元foo - bar.202009.opus (有一些不一致 - 所以簡單的方法就是報廢-<6digitchars>.opus

song title = foo - bar 

使用 sed 報廢,

$ ls | sed 's/-[a-zA-Z0-9]*\w//g; s/.opus//g'

foo - bar
unix - tilde
stack - exchange

我用id3tag設置,synatx

id3tag --song=[tilte] [file]

我在目錄中有所有這些,所以使用 while & read 進行迭代,

ls | while read x; \
   do id3tag \
   $(echo \
   --song=\"$(echo $x | sed 's/-[a-zA-Z0-9]*\w//g; s/.opus//g')\"  \
   \"${x}\"
   ); \
   done

上面的問題是,輸入文件中的空格導致 id3 解釋為另一個文件(即使用 括起來\"${x}\"

所以現在輸出,

foo
'bar"'
'"bar-202009.opus"'
.
.

i3dtag 有沒有辦法將帶有空格的文件視為單個文件。

避免ls解析,單行。

#!/bin/sh

for file in *; do
   scrap="$(echo $file | sed 's/-[a-zA-Z0-9]*\w//g; s/.opus//g')"
   id3tag --song="${scrap}" "${f}"
done

我建議您不要嘗試將其設為單線:

ls | while read x; do
   x="$(echo $x | sed 's/-[a-zA-Z0-9]*\w//g; s/.opus//g')"
   id3tag --song="${x}"
done

annahri 關於不解析ls輸出的觀點很好,所以你可以改為

for x in *.opus; do
.... the rest is the same

使用這種方法,子 shell 消耗引號或將引號作為文字傳遞給id3tag.

引用自:https://unix.stackexchange.com/questions/610311