Linux新手来了。
我正在构建我的第一个 bash 脚本,并且我已经编写了代码来截断和清理 csv 文件名,但是它非常静态,我必须手动计算我想要截断的字符。我想动态删除文件的前缀。我见过很多例子,人们保留前缀,但我实际上想保留最后 7 个字符(或更多......包括文件扩展名。)
示例如下。
# Sample of filenames in a folder
SOLO_PAL3.xyz.ino.IVC.csv -> renamed to IVC.csv
SOLO_PAL3.xyz.ino.EVC.csv -> renamed to EVC.csv
SOLO_PAL3.xyz.ino.VVC.csv -> renamed to VVC.csv
SOLO_PAL3.xyz.ino.WVC.csv -> renamed to WVC.csv
文件名截断 - 虽然这有效,但 cut -c19- 目前需要手动更新特定文件长度的整数。我在这个例子中保留了 echo ,这样我就可以在执行之前看到变化。
for file in ???*;
do echo mv $file `echo $file | cut -c19-`;
# Something equivalent to RIGHT($file,$file.length-($file.length)-7))?
done
提前谢谢了!
答案1
你的问题很类似于这个,我的回答部分基于对该问题的回答。
for f in *.csv
do
newf="${f%.csv}"
newf="${newf##*.}"
printf '%s.csv\n' "${newf}"
done
由于您将问题域定义为所有文件的集合*.csv
,因此该循环首先.csv
从文件名末尾删除 。接下来,它删除由任意字符串后跟点组成的最长可能前缀.
。最后,它printf
是剩余的基本文件名并重新附加.csv
.
执行命令的实际机制mv
留给读者作为练习。
答案2
使用 perlrename
实用程序:
rename -n 's/^.*\.(.{3}\.csv)$/$1/' *.csv
这使得-n
这是一个空运行,所以它实际上不会重命名任何文件,只是显示它的内容会做。检查它是否符合您的要求,然后再次运行它-n
(或替换-n
为-v
以获得详细输出)。
笔记:这只适用于 perl 重命名实用程序,不适用于具有相同名称的其他程序(特别是,util-linux 包中的重命名实用程序是一个完全不同的程序,具有完全不同的功能和命令行选项)。
您可以通过使用 运行来检查是否有 perl rename -V
。输出将类似于:
$ rename -V
/usr/bin/rename using File::Rename version 1.13, File::Rename::Options version 1.10
perl rename 的可执行文件有时称为prename
或file-rename
。如果您安装了上述命令行,请调整上面的命令行以使用它们。