动态修剪文件名

动态修剪文件名

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 的可执行文件有时称为prenamefile-rename。如果您安装了上述命令行,请调整上面的命令行以使用它们。

相关内容