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

时间:2017-06-13 05:52:11

标签: bash shell sh

我想将具有多个扩展名(仅限csv文件)的文件重命名为.csv扩展名。

示例目录中的输入文件:

zebra.txt
sounds.pdf
input.csv
input.csv.aa
input.csv.ab .. ..
input.csv.zz
123.csv
123.csv.aa ...
123.csc.zz xxx.csv yyy.csv

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

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

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

  1. 如果我们可以根据名称合并到一个文件,那也没关系
  2. input.csv(组合所有input.csv.aa,input.csv.ab,..,input.csv.zz)
    123.csv(合并所有123.csv.aa,..,123.csc.zz)xxx.csv yyy.csv

2 个答案:

答案 0 :(得分:0)

尝试这样的第一个选择:

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

这样做:

  1. 查找名称中某处带有.csv扩展名的所有文件,每行放置一个文件名
  2. 更改行以输出原始名称,然后输入竖线字符(|),然后在.csv移至.csv之后添加任何其他附加内容的新文件名(例如input.csv.aa变为input.csv.aa|input.aa.csv
  3. 用换行符替换管道
  4. 对于每两行,作为参数传递给mv以重命名文件

答案 1 :(得分:0)

要重命名*.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