本文总阅读量
文章目录

上一小节,我们学习了一些基本的linux操作,今天我们学习下文件以及文件夹的操作命令:mkdir, cp,mv以及一个简单的for循环。

文件(夹)的操作命令:

1 mkdir 是创建文件夹的一个命令,后面紧跟着你要创建的文件夹的名字。mkdir的使用,有很多敲门。大家可以百度关键词查找: mkdir 窍门,小诀窍 等等。创建一个名字为:ex02的文件夹,然后进入,再创建一个birbro的文件夹:

1
2
3
4
5
6
7
8
9
10
11
12
13
iciq-lq@ln3:/THFS/home/iciq-lq$ ls
bin LVASPTHW
iciq-lq@ln3:/THFS/home/iciq-lq$
iciq-lq@ln3:/THFS/home/iciq-lq$ cd LVASPTHW/
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW$ ls
ex01
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW$ mkdir ex02
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW$ cd ex02
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex02$ ls
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex02$ mkdir bigbro
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex02$ ls
bigbro
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex02$

2 cp这个命令适用于文件以及文件夹的复制。比如:

2.1) 将bigbro 这个文件夹复制名为: bigbra

1
2
3
4
5
6
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex02$ cp bigbro bigbra 
cp: omitting directory `bigbro'
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex02$ cp bigbro bigbra -r
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex02$ ls
bigbra bigbro
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex02$
  • 如果复制文件夹的时候,如上图,出现cp: omitting directory这个错误,在cp命令后,或者前面命令的结尾加上-r即可。

  • 复制文件的时候,不用加 -r。

    1
    2
    cp -r  bigbro bigbra
    cp bigbro bigbra -r

2.2) 将ex01中的四个输入文件复制到bigbra这个文件夹中:

1
2
3
4
5
6
7
8
9
10
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex02$ cp ../ex01/
INCAR KPOINTS POSCAR POTCAR
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex02$ cp ../ex01/* bigbr
bigbra/ bigbro/
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex02$ cp ../ex01/* bigbra/
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex02$ ls *
bigbra:
INCAR KPOINTS POSCAR POTCAR

bigbro:
  • 学会用tab键来提高自己在终端输入的速度,最上面2个cp的命令都是tab的结果。
    • 第一次使用tab,可以列出来ex01中所有的文件;
    • 第二次使用tab,可以列出来当前目录下所有以b开头的文件夹;
  • 学会用*来查看某个目录下所有的内容。

3 mv 是Linux中: 转移、重命名文件(夹)的一个命令,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex02$ mv bigbra bigbro
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex02$ ls
bigbro
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex02$ cd bigbro/
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex02/bigbro$ ls
bigbra
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex02/bigbro$ mv bigbra/ 0.01
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex02/bigbro$ ls
0.01
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex02/bigbro$ cd ../
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex02$ ls
bigbro
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex02$ mv bigbro/0.01/ .
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex02$
  • 把bigbra 文件移动到bigbro里面;
  • 进入bigbro文件夹;

  • 将bigbra文件夹重命名为: 0.01

  • 返回上一层的目录;
  • 将bigbro中的0.01移动到当前的目录下(当前的目录,命令中用点.来代替。);

问题来了:

现在我们需要完成下面的任务:

1)创建从0.02,0.03到0.10,共9个文件夹,

2)每个文件夹中都有与0.01文件夹中相同KPONTS, POSCAR,POTCAR

3)每个文件夹中都有INCAR,但INCAR中SIGMA这个参数的取值和文件夹的名字一样,其他参数和0.01的相同。

为实现这个小目标,我们可以这样做:将0.01复制成0.02,0.03…0.10,然后挨个修改里面的INCAR文件。如下:

1
2
3
4
5
6
7
cp 0.01 0.02
cp 0.01 0.03
......
cp 0.01 0.10
vi 0.02/INCAR
vi 0.03/INCAR
......
  • 小窍门:运行完第一个命令后,敲一下键盘的向上箭头,就会出现刚刚运行的命令,直接修改最后一个数字即可。

神奇的for循环

但大师兄不想挨个创建这9个文件夹,也不想挨个编辑修改INCAR文件中的SIGMA数值。想必大家都不想这么做,因此,在这里教给大家使用一个for循环来快速实现我们的小目标。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex02$ ls
0.01 bigbro
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex02$ rm bigbro/ -fr
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex02$ for i in {2..9}; do cp 0.01 0.0$i ; done
cp: omitting directory `0.01'
cp: omitting directory `0.01'
cp: omitting directory `0.01'
cp: omitting directory `0.01'
cp: omitting directory `0.01'
cp: omitting directory `0.01'
cp: omitting directory `0.01'
cp: omitting directory `0.01'
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex02$ for i in {2..9}; do cp 0.01 0.0$i -r ; done
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex02$ ls
0.01 0.02 0.03 0.04 0.05 0.06 0.07 0.08 0.09
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex02$

上面我们先删掉了bigbro文件夹;

然后使用for循环,发现没有加-r,复制的时候出错了

加上-r之后,for循环顺利的完成了小目标

for循环详解:

1) {2..9} 是为了获取从2到9的所有数字, 有以下几点需要注意:

  • for i in {2..9} 和 for i in 2 3 4 5 6 7 8 9 效果是一样的

  • 用的是花括号

  • 2和9中间有两个点 ..

  • 两个点之间没有空格, 2,9 与两个点之间也没有空格。

  • 不要用中文输入法敲命令。

2)大家还可以练习下面这几个命令来看一下效果: echo是打印输出的命令。

1
2
3
4
echo {1..100} 
echo {A..Z}
echo {a..z}
echo {a..z}{1..10}{A..Z}

3) for i in {2..9} : 翻译过来就是:对于从2到9的任意数字 i, i在这里是一个变量;我们给 i 赋值,值的范围是 从2到9 ; 两点需要注意:

  • i 只是个人喜好而已, 你也可以用 for a in XXX ; for b in XXX;

  • in 后面是一个 集合; 怎么选取这个集合决定了for循环的威力;

4) for i in XXX 这个句字后面跟着一个分号,如果没有便会出错。分号前后可以有空格,也可以没有,为了让自己写的东西更加直观,建议加上空格;

5) do 翻译过来就是: 我们要实现什么任务,目的; do 后面跟一个空格, 或者几个空格

6) cp 0.01 0.0$i -r

  • cp 0.01 把 0.01 这个文件夹复制成 0.0$i 文件夹;

  • $i 被替换成for后面变量 i 的值;

7) 复制完成后,后面跟着一个分号;

8) done 完成任务。

9)大家可以尝试着其他类似的命令: for i in XXX; do XXX ; done 比如:

1
for bigbro in {A..Z}; do echo bigbro is $bigbro ; done

这个例子只是为了说明:

  • for 后面的变量如果你用 i 表示,那么后面就用$i 来引用;
  • 如果用bigbro 来表示,后面则用$bigbro;
  • $和后面的变量之间(bigbro)没有空格。(你可以加上空格,看看有什么错误出现!)

思考下:

对于一个文件A,我们的目的是将A重命名为B。有下面2种操作可供选择:

第一种) mv A B

第二种) cp A B 然后 rm A

从结果上来说,这两种做法都是可以的。这里大师兄想告诉你的是:

i) 尽量找最简单的方法(第一种)实现所期望的目的;

ii) 如果不知道最简单的方法, 那么可以尝试其他方式来解决(第二种)。

小结:

通过本小节的学习:一方面我们熟悉文件(夹)创建,复制,移动以及重命名的linux命令:mkdir, mv, cp。另一方面,初步掌握for循环来实现批量处理的效果。请大家务必多加操练,以及完成扩展练习。至少图中的例子要练习一遍,能看懂什么意思。本节的for循环,我们只完成了一半的任务,每个文件夹中的INCAR还没有修改,下一节我们介绍另一个批量处理的方法来实现这个目的。

此外, linux的命令操作有很多的小技巧,大家一定要多多去网上搜集,加以练习,这对于提高工作效率非常有帮助。

文章目录
/* */