![Unix - 通过删除字符的最后两个实例来重命名文件](https://linux22.com/image/1406685/Unix%20-%20%E9%80%9A%E8%BF%87%E5%88%A0%E9%99%A4%E5%AD%97%E7%AC%A6%E7%9A%84%E6%9C%80%E5%90%8E%E4%B8%A4%E4%B8%AA%E5%AE%9E%E4%BE%8B%E6%9D%A5%E9%87%8D%E5%91%BD%E5%90%8D%E6%96%87%E4%BB%B6.png)
我需要在 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 解决方案,但也不应该算作异国情调。