很抱歉,出于隱私原因,我無法提供實際的檔案名。
names.txt包含由單個 . 分隔的幾組行empty line。每個組都屬于一個特定的檔案。每組線的線數各不相同。這些行組之間的唯一相似之處在于,每 1 行參考某個檔案的舊名稱,而每 2 行參考該檔案所需的新名稱。
這些行中沒有空格。還有一些其他字符,例如數字、下劃線、& 和正斜杠。
names.txt在同一個目錄中,它看起來像這樣:
a1.pdf
Newname_for_a1.pdf
--some-texts--
b2.pdf
Newname_for_b2.pdf
--some-texts--
--some-texts--
c3.pdf
Newname_for_c3.pdf
--some-texts--
--some-texts--
d4.pdf
Newname_for_d4.pdf
--some-texts--
--some-texts--
--some-texts--
--more_texts_below--
舊名稱以小寫字母開頭,而新名稱以大寫字母開頭,都帶有.pdf擴展名
ls會給
a1.pdf
b2.pdf
c3.pdf
d4.pdf
names.txt
several-filenames-below
我可以在 Bash 中執行此操作嗎?請幫忙。
編輯。 最初我想處理 2 個 .txt 檔案,oldnames.txt 和 newnames.txt,然后我意識到也許只有 1 個 txt 檔案可以做到這一點。
我已經嘗試過的是觀看了一些有關 grep 的正則運算式的視頻教程,但我覺得如果我進行實際的文本操作(例如查找、移動、重命名檔案)我會更好地理解它,因為我也在處理整理和組織數百 Gbs 的媒體檔案和個人檔案。
我現在正在研究這個執行緒
如何將檔案名從一個txt檔案重命名為bash中另一個txt檔案的檔案名?
編輯
2我現在可以從names.txtby
中grep每個組中第一行(舊名稱)的實體,以及by
中每個組grep --color -n -E "^[a-z].*\.pdf$" names.txt
中第二行(新名稱)的實體names.txtgrep --color -n -E "^[A-Z].*\.pdf$" names.txt
uj5u.com熱心網友回復:
由于使用mv命令重命名操作是不可逆的。
建議將所有
mv命令寫入檔案renames.sh。awk '{print "mv \""$1"\"", "\""$2"\""}' RS="\n\n" RSnames.txt > renames.sh檢查并更正
renames.sh檔案。
注意:清除檔案名中的所有引號'和/或雙引號"。每個檔案名都需要用雙引號括起來"。如果檔案名中有'或,腳本將失敗。"
執行檔案
mv中的所有命令renames.sh。通過將renames.sh檔案作為腳本運行。bash renames.sh
awk腳本解釋:
RS="\n\n"
將awk記錄分隔符設定為empty line.
print "mv \""$1"\"", "\""$2"\""
列印 bash 命令mv "file1" "file2"。
File1 從第一個awk欄位$1檢索,File2 從第二個awk欄位檢索$2。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/468643.html
