我有很多檔案可供選擇,例如。
foo_de.vtt, foo_en.vtt, foo_es.vtt, foo_fr.vtt, foo_pt.vtt, baa_de.vtt, baa_en.vtt, baa_es.vtt, baa_fr.vtt, baa_pt.vtt... etc.
我創建了一個制表符分隔的檔案,filenames.txt其中包含當前字串和替換字串,例如。
foo 1000
baa 1016
...etc
我想重命名所有檔案以獲得以下內容:
1000_de.vtt, 1000_en.vtt, 1000_es.vtt, 1000_fr.vtt, 1000_pt.vtt, 1016_de.vtt, 1016_en.vtt, 1016_es.vtt, 1016_fr.vtt, 1016_pt.vtt
我知道我可以使用 rename 之類的實用程式逐項手動執行,例如:
rename 's/foo/1000/g' *.vtt
我可以將它鏈接到一個 awk 命令中,以便它可以運行filenames.txt嗎?或者有沒有更簡單的方法可以在 awk 中做到這一點?我知道我可以用 awk 重命名,例如:
find . -type f | awk -v mvCmd='mv "%s" "%s"\n' \
'{ old=$0;
gsub(/foo/,"1000");
printf mvCmd,old,$0;
}' | sh
如何讓 awk 處理 filenames.txt 并一次性完成所有這些操作? 這個問題類似,但使用 sed。我覺得在 awk 中被制表符分隔應該很容易?
第一次發帖所以請溫柔!
解決方案
感謝你的幫助。最終,我能夠通過調整您的答案來解決以下問題:
while read new old; do
rename "s/$old/$new/g" *.vtt;
done < filenames.txt
uj5u.com熱心網友回復:
我假設 TSV 檔案中的字串是文字(不是正則運算式也不是 glob),并且要替換的部分可以位于檔案名中的任何位置。
話雖如此,您可以使用mvshell glob 和 bash 引數擴展:
#!/bin/bash
while IFS=$'\t' read -r old new
do
for f in *"$old"*.vtt
do
mv "$f" "${f/"$old"/$new}"
done
done < file.tsv
或者使用 GNU rename(性能更高):
while IFS=$'\t' read -r old new
do
rename "$old" "$new" *"$old"*.vtt
done < file.tsv
uj5u.com熱心網友回復:
使用sed
while read old new; do
sed "s/$old\(.*\)/mv & $new\1/e" <(find . -name '*.vtt' -printf '%f\n')
done < filenames.txt
uj5u.com熱心網友回復:
這可能對您有用(GNU sed 和重命名):
sed -E 's#(.*)\t(.*)#rename -n '\''s/\1/\2/'\'' \1*#e' ../file
這將構建一個腳本,用于重命名當前目錄中的檔案,file以匹配和替換部分檔案名。
一旦您對結果感到滿意,請洗掉-n并重新命名。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/475851.html
