我想使用 Ubuntu 终端重命名文件夹中的数百个文件,因为我不允许安装任何东西。
文件的名称采用以下格式:ER201703_Company_Name_Something_9876543218_90087625374823.csv之后它应该看起来像这样:ER201703_9876543218_90087625374823.csv
所以,我想删除中间部分(Company_name_something(,它有时有 2、3 甚至 4 个_。我想创建 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 的位置并保留从那里到字符串末尾的所有内容。
此致敬意一月
如果安装了rename
(我认为 Ubuntu 就是这种情况(,您可以使用以下命令而不是循环。
rename -n 's/^(ERd*)w*?(_9w*)/$1$2/' *.csv
删除-n
(无操作(以应用更改。
解释
-
s/.../.../
将左正则表达式的匹配项替换为右模式。 -
(ERd*)
匹配第一部分(ER
后跟一些数字(并将其存储在$1
中以供以后使用。 -
w*?
与公司部分相匹配,即尽可能少(非贪婪(的单词字符(字母、数字、下划线等(。 -
(_9w*)
与第二部分匹配,并将其存储在$2
中以供以后使用。 -
$1$2
是替换先前匹配的零件。我们只省略了公司部分。
awk -F'_' '{printf "mv %s %s_%s_%sn",$0,$1,$(NF-1),$NF}'
例:
kent$ awk -F'_' '{printf "mv %s %s_%s_%sn",$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
(,重命名将完成。
如果您的文件名可以包含空格,请考虑用双引号引用文件名。
我可以提供替代解决方案,可能更通用。
rename 's/^([^_]+(?=_))(?:w+(?=_d+))(_d+_d+.csv)$/$1$2/' *.csv
在这种情况下,日志的名称将更改,您希望拥有强大的正则表达式。
([^_]+(?=_)) - match everything that not underscore till the first one and store it to $1
(?:w+(?=_d+)) - match chars until the numbers but (?:...) not store to var
(_d+_d+.csv) - match set of numbers and file extension and store it to $2