我有 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.hdf
、MOD11A1.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/new
old
用。。。来代替new
\.
文字.
...
三个字符可以是任何字符(some chars)
保存some chars
以供以后参考$1
- 我们可以使用一个简单的正则表达式来匹配命令中文件名的第一部分
rename
,就像 muru 的答案那样。有时你想使用更明确的表达式来区分你想或不想执行的文件,或者确保你的正则表达式不会吸收太多字符。解决这类问题通常有很大的灵活性。
请注意没有它会给出你想要的结果;它会保持数字的固定宽度。我这样做是因为在文件名中使用固定宽度的数字是个好主意(否则它们会以一种令人困惑的方式排序,例如 10 排在 2 前面)(并且因为我还没有弄清楚如何使用 muru 的回答是那样嗎……)。rename
来创建你实际要求的名称...如果我这样做,我会更新我的答案
注意rename
17.10 默认安装中不包含Perl,因此如果你正在运行 17.10(或者对于未来的读者来说,可能是更高版本),请先运行
sudo apt install rename
答案4
下面的代码将执行以下操作:
- 循环遍历以 开头
MOD
和结尾的所有文件.hdf
- 分配一个变量,每出现一个文件,该变量的值就会增加 1
mv
对列表中的当前文件执行命令,并将其名称更改为modis
跟随变量中的数字,跟随.hdf
#!/bin/bash idx=1 for file in MOD*.hdf do echo mv "$file" "modis$((idx++)).hdf" done
注意:上述脚本仅会echo
执行它计划执行的命令,您需要echo
从echo 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