重命名具有复杂编号名称的多个文件

Vai*_*ain 6 command-line rename batch-rename mv

我有 365 个文件名

MOD11A1.A2010001.h24v06.006.2016025150444.hdf
MOD11A1.A2010002.h24v06.006.2016025151748.hdf
MOD11A1.A2010003.h24v06.006.2016025163706.hdf
Run Code Online (Sandbox Code Playgroud)

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

modis1.hdf
modis2.hdf
modis3.hdf
Run Code Online (Sandbox Code Playgroud)

mv为每个文件分别使用该命令来重命名它们。

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

mur*_*uru 10

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

rename -n 's/.*A2010*(\d+).*/modis$1.hdf/' *
Run Code Online (Sandbox Code Playgroud)

例子:

$ 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)
Run Code Online (Sandbox Code Playgroud)

运行而不-n实际重命名文件。

  • @Arronical `\d` 是 Perl 正则表达式中的任何数字,`()` 是一个捕获组,前面的 `0*` 取所有前导零 (4认同)

Arr*_*cal 6

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

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

或者作为单线:

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

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


Zan*_*nna 6

你可以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)
Run Code Online (Sandbox Code Playgroud)

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

笔记

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

请注意,这并不能完全满足您的要求;它保持数字的固定宽度。我这样做是因为在文件名中使用固定宽度的数字是个好主意(否则它们会以令人困惑的方式排序,例如 10 在 2 之前)(和因为我还没有弄清楚如何使用rename来创建您实际要求的名称......如果我这样做了,我会更新我的答案 穆鲁的回答就是……)。

请注意,默认的 17.10 安装中不包含Perlrename,因此如果您运行的是 17.10(或者对于未来的读者,可能是更高版本),请首先运行

sudo apt install rename
Run Code Online (Sandbox Code Playgroud)


Yar*_*ron 5

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

  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
    
    Run Code Online (Sandbox Code Playgroud)

注意:上面的脚本只会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
Run Code Online (Sandbox Code Playgroud)