我想使用Ubuntu终端重命名文件夹中的几百个文件,因为我不允许安装任何文件。
文件名采用以下格式: ER201703_Company_Name_Something_9876543218_90087625374823.csv 之后它应该是这样的: ER201703_9876543218_90087625374823.csv
所以,我想删除中间部分(Company_name_something),有时候有2个,3个甚至4个_s。我想创建2个字符串;一个用于前部,一个用于后部。前部很容易并且已经正常工作但我正在使用后部。
for name in *.csv;
do
charleng=${#name};
start=$(echo "$name" | grep -a '_9');
back=$(echo "$name" | cut -c $start-);
front=$(echo "$name" | cut -c1-9);
mv "$name""$front$back";
done
我试图找到_9的位置,并保留从那里到字符串末尾的所有内容。
祝你好运 扬
答案 0 :(得分:0)
awk -F'_' '{printf "mv %s %s_%s_%s\n",$0,$1,$(NF-1),$NF}'
示例:
kent$ awk -F'_' '{printf "mv %s %s_%s_%s\n",$0,$1,$(NF-1),$NF}' <<<"ER201703_Company_Name_Something_9876543218_90087625374823.csv"
mv ER201703_Company_Name_Something_9876543218_90087625374823.csv ER201703_9876543218_90087625374823.csv
这个单行将打印出mv old new
命令。如果没问题,只需将输出管道输出到|sh
,(awk ....|sh
),重命名即可完成。
如果你的文件名可以包含空格,请考虑用双引号引用文件名。
答案 1 :(得分:0)
如果安装了rename
(我认为是Ubuntu的情况),您可以使用以下命令而不是循环。
rename -n 's/^(ER\d*)\w*?(_9\w*)/$1$2/' *.csv
删除-n
(无行为)以应用更改。
s/.../.../
用正确的模式替换左正则表达式的匹配。 (ER\d*)
匹配第一部分(ER
后跟一些数字)并将其存储在$1
内以供日后使用。\w*?
匹配公司部分,即尽可能少的(非贪婪的)单词字符(字母,数字,下划线,...)。(_9\w*)
与第二部分匹配,并将其存储在$2
内以供日后使用。$1$2
是以前匹配的部分的替代品。我们只省略了公司部分。答案 2 :(得分:0)
我可以提供替代解决方案,可能更通用。
non_emp_tree
如果日志名称发生变化,您希望拥有强大的正则表达式。
rename 's/^([^_]+(?=_))(?:\w+(?=_\d+))(_\d+_\d+\.csv)$/$1$2/' *.csv