我们知道,linux 中可以使用 mv 命令来移动或者重命名文件和目录,且不会改变 inode 编号和时间戳。其语法如下:
mv [-f | -i | -n] [-hv] source target
mv [-f | -I | -n] [-v] source … directory
但是,mv 命令一次只能操作一个文件或者目录,如果现在我有好几个文件甚至好几百个文件需要处理,是不是就不能用 mv 来实现?
先看测试目录下的文件,这里有 9 个 beforeN.dat 的文件,需要把他们的文件名都改成 afterN.dat 的格式。
(这里只有 9 个文件,想一个一个修改也不是不可以。。。这里只是举例。。。)
bash shell 提供了 for 命令,允许用户创建一个遍历一系列值的循环,以此来重复执行一系列命令。
比如这里我想找出所有符合 beforeN.dat 格式的文件,那么可以使用如下指令:
$ for file in `ls before*.dat`;do echo $file;done
稍微修改一下上面的指令,使输出的文件名转换成指定的格式,即把文件名中的 before 改成 after。
sed 编辑器可以根据命令来处理数据流中的数据,这正是我们所需要的。
修改后的指令如下:
$ for file in `ls before*.dat`;do echo $file | sed s/before/after/;done
这是不是就是想要的格式。
现在,只需要把 echo 换成 mv 命令再调整一下就好啦!
最终版本:
for file in `ls before*.dat`;do mv -v $file `echo $file | sed s/before/after/`;done
注意,这里的 -v 参数不是必须的,完全可以省略,只是为了跟直观地看一下修改的过程而已。