在 Linux bash 中使用 mutilple 扩展名重命名 *.csv.* 文件



我想重命名具有多个扩展名的文件(仅限csv文件),扩展名.csv到末尾。

示例 目录中的输入文件:

斑马.txt
声音.pdf输入
.csv
输入.csv.aa
输入.csv.ab .. ..
输入.csv.zz
123.csv
123.csv.aa ...
123.csc.zz xxx.csv yyy.csv

所有.csv文件都采用相同的格式。我希望输出是 *.csv 文件,没有进一步的扩展名

我想重命名文件以保持扩展名的最后一部分被交换,如下所示。

input.csv.aa to input_aa.csv
input.csv.ab to input_ab.csv ..
input.csv.zz 到 input_zz.csv
xxx.csv - 将保持原样 yyy.csv - 将保持原样

  1. 如果我们可以根据名称合并为一个文件,那也没关系

input.csv (合并所有input.csv.aa,input.csv.ab,..,input.csv.zz)
123.csv(合并所有123.csv.aa,..,123.csc.zz) xxx.csv yyy.csv

为您的第一个选项尝试这样的事情:

find . -name "*.csv*" | 
sed -e 's/((.*).csv(.*))/1|23.csv/' | 
tr '|' 'n' | 
xargs -n 2 mv

这样做:

  1. 在名称的某处查找所有具有.csv扩展名的文件,每行放置一个文件名
  2. 更改行以输出原始名称,然后输出管道字符(|),然后在.csv移动到.csv之前(例如input.csv.aa变成input.csv.aa|input.aa.csv)
  3. 用换行符替换管道
  4. 对于每两行,作为参数传递给mv重命名文件

重命名*.csv文件:

find . -regex ".*.csv.[a-z]*$" -exec rename 's/(.csv).([a-z]+)$/_$2$1/' {} ;
  • -regex pattern- 文件名与正则表达式pattern匹配

  • rename perlexp- 根据 Perl 表达式重命名文件名perlexp


要将一组单独的文件(假设input.csv.aa,input.csv.ab, ..,input.csv.zz)合并到一个文件中 - 使用以下cat方法:

cat input.csv.* > input.csv

最新更新