![刪除檔案名稱開頭和結尾的字元模式](https://rvso.com/image/154481/%E5%88%AA%E9%99%A4%E6%AA%94%E6%A1%88%E5%90%8D%E7%A8%B1%E9%96%8B%E9%A0%AD%E5%92%8C%E7%B5%90%E5%B0%BE%E7%9A%84%E5%AD%97%E5%85%83%E6%A8%A1%E5%BC%8F.png)
我有一堆文件想要重命名。它們的檔案名稱採用特定格式:
p1.uniquenameA#blah_a
p2.uniquenameB#blah_b
p3.uniquenameC#blah_c
p4.uniquenameD#blah_d
p5.uniquenameE#blah_e
p6.uniquenameF#blah_f
p7.uniquenameG#blah_g
p8.uniquenameH#blah_h
p9.uniquenameI#blah_i
p10.uniquenameJ#blah_j
每個唯一的檔案名稱之前都有一個前綴。在這種情況下,該前綴以字母開頭p
,後面有一個數字,p
該數字遞增一。句點 ( .
) 將前綴與唯一檔案名稱分隔開。每個唯一檔案名稱後面都有一個以主題標籤 ( #
) 開頭的後綴。我想刪除從句點開始的前綴(包括句點),我還想刪除從主題標籤開始(包括主題標籤)的後綴。我希望生成的檔案名稱只是句點和哈希標籤之間的唯一檔案名,如下所示:
uniquenameA
uniquenameB
uniquenameC
uniquenameD
uniquenameE
uniquenameF
uniquenameG
uniquenameH
uniquenameI
uniquenameJ
我是腳本編寫新手,因此如果您除了提供程式碼之外還能解釋程式碼的工作原理,我將不勝感激。
答案1
如果您擁有perl
的版本rename
(有時稱為prename
),您可以套用正規表示式替換:
rename -n 's/^.*?\.(.*?)#.*/$1/' *
如果您不了解正規表示式 (RE),它們非常值得學習。
s/xx/yy/
- 用xx
。yy
^
- 匹配隱式行首.*?
- 盡可能匹配短的字串任何內容的零個或多個字符以模式匹配的其餘部分為準\.
- 匹配文字點.
(該.
字元代表任何事物,但是\.
是一個字面點)(
....)
匹配括號內的模式並為其指定匹配編號 1..9;後來被引用$1
(第二個(
......)
將是$2
,等等)#
- 文字字符.*
- 最長的比賽是任何內容的零個或多個字符(這.
是任何事物且*
前一項的意思是_零個或多個)
-n
當您高興時刪除(“無操作”)會工作。將其替換為-v
以查看實際發生的情況,或忽略它以進行靜默操作。
答案2
這是awk
執行該任務的腳本:
僅用於列印/調試:
awk 'match($0,/(^[^\\.]+.)([^#]+)/,m){print "mv "$0" "m[2] }' input.txt
進行重新命名:
awk 'match($0,/(^[^\\.]+.)([^#]+)/,m){system("mv "$0" "m[2])}' input.txt
輸入.txt
p1.uniquenameA#blah_a
p2.uniquenameB#blah_b
p3.uniquenameC#blah_c
p4.uniquenameD#blah_d
p5.uniquenameE#blah_e
p6.uniquenameF#blah_f
p7.uniquenameG#blah_g
p8.uniquenameH#blah_h
p9.uniquenameI#blah_i
p10.uniquenameJ#blah_j
輸出
mv p1.uniquenameA#blah_a uniquenameA
mv p2.uniquenameB#blah_b uniquenameB
mv p3.uniquenameC#blah_c uniquenameC
mv p4.uniquenameD#blah_d uniquenameD
mv p5.uniquenameE#blah_e uniquenameE
mv p6.uniquenameF#blah_f uniquenameF
mv p7.uniquenameG#blah_g uniquenameG
mv p8.uniquenameH#blah_h uniquenameH
mv p9.uniquenameI#blah_i uniquenameI
mv p10.uniquenameJ#blah_j uniquenameJ
答案3
這是一個使用的解決方案sed
for i in *
do
mv $i $( echo $i | sed 's/p[[:digit:]]*\.\([^#]*\)\#.*/\1/' )
done
目標是sed
透過查找p
後跟任意數量的數字和句點來創建的。從這個時期開始直到#
是記住了到暫存器中,整個檔案名稱被替換為記住了人物。