使用复杂的数字名称重命名多个文件

使用复杂的数字名称重命名多个文件

我有 365 个文件名为

MOD11A1.A2010001.h24v06.006.2016025150444.hdf
MOD11A1.A2010002.h24v06.006.2016025151748.hdf
MOD11A1.A2010003.h24v06.006.2016025163706.hdf

我想将这些文件重命名为:

modis1.hdf
modis2.hdf
modis3.hdf

我正在mv对每个文件分别使用命令来重命名它们。

我如何一次性实现这一目标?

答案1

由于您只关心位,因此在包含文件的目录中A2010... 使用:rename

rename -n 's/.*A2010*(\d+).*/modis$1.hdf/' *

例子:

$ rename -n 's/.*A2010*(\d+).*/modis$1.hdf/' *
rename(> MOD11A1.A2010001.h24v06.006.2016025150444.hdf, modis1.hdf)
rename(> MOD11A1.A2010002.h24v06.006.2016025151748.hdf, modis2.hdf)
rename(> MOD11A1.A2010003.h24v06.006.2016025163706.hdf, modis3.hdf)
rename(> MOD11A1.A2010365.h24v06.006.2016025150444.hdf, modis365.hdf)

-n无需实际重命名文件即可运行。

答案2

以下方法使用 bash 参数扩展,但它确实依赖于文件名完全符合您所述的格式,因为它依赖于要使用的数字字符串的位置。这不一定是最可靠的方法。您还必须位于包含文件的目录中。

for f in MOD*.hdf; do
  num="${f:13:3}"
  mv "$f" modis"$((10#$num))".hdf
done

或者用一行代码来表达:

for f in MOD*.hdf; do num="${f:13:3}"; mv "$f" modis"$((10#$num))".hdf ; done

这将按您要求的方式移动文件,即将MOD11A1.A2010001.h24v06.006.2016025150444.hdf变成modis1.hdfMOD11A1.A2010002.h24v06.006.2016025151748.hdf变成modis2.hdf等等。

答案3

你可以使用rename如下命令:

$ rename -n 's/MOD11A1\.A2010(...)\..*/modis$1.hdf/' MOD*.hdf
rename(MOD11A1.A2010001.h24v06.006.2016025150444.hdf, modis001.hdf)
rename(MOD11A1.A2010002.h24v06.006.2016025151748.hdf, modis002.hdf)
rename(MOD11A1.A2010003.h24v06.006.2016025163706.hdf, modis003.hdf)

经过测试后,删除-n以实际重命名文件。

笔记

  • s/old/newold用。。。来代替new
  • \.文字.
  • ...三个字符可以是任何字符
  • (some chars)保存some chars以供以后参考$1
  • 我们可以使用一个简单的正则表达式来匹配命令中文件名的第一部分rename,就像 muru 的答案那样。有时你想使用更明确的表达式来区分你想或不想执行的文件,或者确保你的正则表达式不会吸收太多字符。解决这类问题通常有很大的灵活性。

请注意没有它会给出你想要的结果;它会保持数字的固定宽度。我这样做是因为在文件名中使用固定宽度的数字是个好主意(否则它们会以一种令人困惑的方式排序,例如 10 排在 2 前面)(并且因为我还没有弄清楚如何使用rename来创建你实际要求的名称...如果我这样做,我会更新我的答案 muru 的回答是那样嗎……)。

注意rename17.10 默认安装中不包含Perl,因此如果你正在运行 17.10(或者对于未来的读者来说,可能是更高版本),请先运行

sudo apt install rename

答案4

下面的代码将执行以下操作:

  1. 循环遍历以 开头MOD和结尾的所有文件.hdf
  2. 分配一个变量,每出现一个文件,该变量的值就会增加 1
  3. mv对列表中的当前文件执行命令,并将其名称更改为modis跟随变量中的数字,跟随.hdf

    #!/bin/bash 
    idx=1
    for file in MOD*.hdf
    do
        echo mv "$file" "modis$((idx++)).hdf"
    done
    

注意:上述脚本仅会echo执行它计划执行的命令,您需要echoecho mv行中删除才能执行操作。

示例输出:

mv MOD11A1.A2010001.h24v06.006.2016025150444.hdf modis1.hdf
mv MOD11A1.A2010002.h24v06.006.2016025151748.hdf modis2.hdf
mv MOD11A1.A2010003.h24v06.006.2016025163706.hdf modis3.hdf

相关内容