Unix - 通过删除字符的最后两个实例来重命名文件

Unix - 通过删除字符的最后两个实例来重命名文件

我需要在 Unix 上重命名一些文件。我想截断最后两个下划线以及其后的所有内容。例如:

abc_def_ghi_121222_as.csv --> abc_def_ghi.csv

xy_cv_sac_bnmkj_ppa_jkl_lkkjll.csv --> xy_cv_sac_bnmkj_ppa.csv

我怎样才能实现这个目标?

答案1

该脚本应该可以工作:

#!/bin/bash

for FILE in $(ls)
do
  if [[ $FILE =~ csv$ ]]; then
    [[ $FILE =~ ^(.*)_(.*)_(.*).csv$ ]]
    NEWFILENAME="${BASH_REMATCH[1]}.csv"
    mv $FILE $NEWFILENAME
  fi
done

将它放入要重命名文件的文件夹中并运行它。它会将所有以 结尾的文件csv从其当前名称重命名为最后 2 个下划线之前的名称。

答案2

谢谢@mtak @mestia 我也有替代方案

 for f in *[0-9]*.csv;  
do  
x=`echo  $f|cut -d. -f1`; 
y=`echo $x|rev|sed -e 's/_/$/1'|rev` ; 
z=`echo $y|cut -d$ -f1`".csv"  ; 
echo mv "${f}" "${z}";  
done

谢谢,S。

答案3

您可以使用 Perlrename来实现这一点。它应该随 Perl 发行版一起提供;在 Debian 中,它被打包为perl 包prename以 为别名rename

例如:

$ ls -1
$ touch abc_def_ghi_121222_as.csv xy_cv_sac_bnmkj_ppa_jkl_lkkjll.csv
$ ls -1
abc_def_ghi_121222_as.csv
xy_cv_sac_bnmkj_ppa_jkl_lkkjll.csv
$ rename 's/_[^_]*_[^_]*\.csv$/.csv/' *
$ ls -1
abc_def_ghi.csv
xy_cv_sac_bnmkj_ppa.csv
$

这将处理给定的所有文件名,应用提供的正则表达式并将每个文件重命名为结果。

Perl 应该可以在大多数系统上使用,因此虽然它严格来说不是一个 shell 解决方案,但也不应该算作异国情调。

相关内容