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
实际重命名文件。
以下方式使用 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.hdf
、MOD11A1.A2010002.h24v06.006.2016025151748.hdf
变为modis2.hdf
等。
你可以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
替换old
为new
\.
文字 .
...
可以是任何东西的三个字符(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)
下面的代码将执行以下操作:
MOD
和结尾的文件.hdf
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
执行它计划执行的命令,您需要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
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2182 次 |
最近记录: |