簡體   English   中英

在模式前在文件名中添加字符串

[英]Add string in filename before pattern

我需要在匹配模式的文件名之間添加字符串。

樣本文件名:

file_1_my001
file_11_my0012
file_65_my_012

我想將它們重命名為:

file_1_my_copied_001
file_11_my_copied_0012
file_65_my_copied_012

模式為<any string>0<any string>

我的邏輯是首先獲取以0開頭的數字格式,將其存儲為模式,然后搜索該變量並將其替換為_copied_<variable> 我嘗試將數字提取為:

ls | sed -e s/[^0-9]//g

但是上面的命令正在獲取文件名中的所有數字,例如 1001, 110012, 65012我無法使其搜索以0開頭的數字格式。請指導。

使用基於perlrename命令:

$ touch file_1_my001 file_11_my0012 file_65_my_012
$ rename -n 's/_?(?=0)/_copied_/' file_*
rename(file_11_my0012, file_11_my_copied_0012)
rename(file_1_my001, file_1_my_copied_001)
rename(file_65_my_012, file_65_my_copied_012)
  • _?(?=0)零或_一個實例,后跟0
  • -n選項用於空運行,看起來不錯后,刪除該選項以進行實際重命名


如果基於perlrename不可用,請嘗試:

$ for file in file_* ; do echo mv "$file" $(echo "$file" | sed 's/_\?0/_copied_0/'); done
mv file_11_my0012 file_11_my_copied_0012
mv file_1_my001 file_1_my_copied_001
mv file_65_my_012 file_65_my_copied_012

如果可以,請將echo mv更改為mv以進行實際重命名


如果不存在0之前的可選_ ,則使用參數擴展會更容易

$ touch file_1_my001 file_11_my0012 file_65_my012
$ for file in file_* ; do echo mv "$file" "${file/0/_copied_0}"; done
mv file_11_my0012 file_11_my_copied_0012
mv file_1_my001 file_1_my_copied_001
mv file_65_my012 file_65_my_copied_012
ls | sed -e 's/\([_]*0\)/_copied_0/' 

就像是,

$ sed -E "s/(.*[^0-9]+)(0[0-9]*)/\1_copied_\2/"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM