重命名长文件名,同时保留名称的一部分

时间:2015-04-21 21:21:39

标签: bash shell

我有很多具有某种模式的文件:

some123_name4.with5.number01-02_and6-other7.stuff.txt
some123_name4.with5.number05-06_and6-other7.stuff.txt
some123_name4.with5.number11-12_and6-other7.stuff.txt

并且我想重命名它们将部分保留在中间数字?? - ?? 。例如:

different45_start.keep76.number01-02_but.change34_rest.txt
different45_start.keep76.number05-06_but.change34_rest.txt
different45_start.keep76.number11-12_but.change34_rest.txt

我玩过expr,%%和?但我甚至没有设法提取文件名的 number ?? - ?? 部分。

3 个答案:

答案 0 :(得分:2)

应该这样做(用实际模式代替)

#!/bin/bash

for f in some123* ; do
   mv $f `echo $f | sed -e 's/some123_name4.with5/different45_start.keep76/' -e 's/and6-other7.stuff/but.change34_rest/'`
done

答案 1 :(得分:1)

我建议您使用正则表达式将旧名称中的数字提取到新名称中吗?然后它只是一个关于

的问题
  • 创建一个新的子目录(以防你出错)
  • 使用" ls"列出文件名(每行有1(一)个名称的选项,而不是跟随到子目录)
  • 迭代文件名

在每次迭代中,

  • 设置新名称
  • 运行副本commande" cp"使用旧名称和新名称(但作为一个技巧,复制到您的新子目录)

总而言之,这样的事情:

mkdir NEW
ls -1d some* \
| while read FILE; do
        NEWFILE=`echo "$FILE" \
        | sed 's|^some12\\([0-9]\\)_name\\([0-9]\\)[.]with\\([0-9]\\)[.]number\\([0-9][0-9]-[0-9][0-9]\\)_and\\([0-9]\\)-other\\([0-9]\\)[.]stuff[.]txt$|different\\2\\3_start.keep\\6\\5.number\\4_but.change\\1\\2_rest.txt|'`
        cp "$FILE" NEW/"$NEWFILE"
done

正如您所看到的,由于反引号(`),您必须在正则表达式中使用额外的反斜杠。

作为一个开始,这对你有帮助吗?

答案 2 :(得分:1)

使用expr的可能解决方案如下所示:

for f in *number??-??*; do
    fixedPart=$(expr "$f" : '.*\(number[0-9][0-9]-[0-9][0-9]\).*')
    newName="different45_start.keep76.${fixedPart}_but.change34_rest.txt"
    mv "$f" "$newName"
done
相关问题