-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path0220filemanager.html
1908 lines (1907 loc) · 158 KB
/
0220filemanager.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<!DOCTYPE html>
<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="Author" content="VBird, 鸟哥">
<meta name="Description" content="说明在 Linux 底下处理文件与目录的相关指令啊~^_^">
<title>鸟哥的 Linux 私房菜 -- 第六章、Linux 文件与目录管理</title>
<style type="text/css">
</style>
<link href="./vbird_files/style_2013.css" rel="stylesheet" type="text/css">
</head>
<body>
<div class="tablearea">
<div class="mainarea">
<div class="block1">
<!-- 本文的档头部分 -->
<h1>第六章、Linux 文件与目录管理</h1>
<div style="text-align:right">
<span class="text_history">最近更新日期:2015/06/24</span>
</div>
<!-- 本文的档头部分 -->
<div class="abstract">
<p>在前一章我们认识了Linux系统下的文件权限概念以及目录的配置说明。
在这个章节当中,我们就直接来进一步的操作与管理文件及目录吧!包括在不同的目录间变换、
创建与删除目录、创建与删除文件,还有寻找文件、查阅文件内容等等,都会在这个章节作个简单的介绍啊!</p>
</div>
<!-- 本文的链接区部分 -->
<div class="links">
<ul>
<li><a href="0220filemanager.html#dir">6.1 目录与路径</a>
<ul>
<li><a href="0220filemanager.html#dir_pathway">6.1.1 相对路径与绝对路径</a></li>
<li><a href="0220filemanager.html#dir_opdir">6.1.2 目录的相关操作</a>: <a href="0220filemanager.html#cd">cd</a>, <a href="0220filemanager.html#pwd">pwd</a>,
<a href="0220filemanager.html#mkdir">mkdir</a>, <a href="0220filemanager.html#rmdir">rmdir</a></li>
<li><a href="0220filemanager.html#dir_path">6.1.3 关于运行档路径的变量: $PATH</a></li>
</ul></li>
<li><a href="0220filemanager.html#file_dir_manage">6.2 文件与目录管理</a>
<ul>
<li><a href="0220filemanager.html#ls">6.2.1 文件与目录的查看: ls</a></li>
<li><a href="0220filemanager.html#cprmmv">6.2.2 复制、删除与移动</a>: <a href="0220filemanager.html#cp">cp</a>, <a href="0220filemanager.html#rm">rm</a>, <a href="0220filemanager.html#mv">mv</a></li>
<li><a href="0220filemanager.html#dir_name">6.2.3 取得路径的文件名称与目录名称</a></li>
</ul></li>
<li><a href="0220filemanager.html#file_content">6.3 文件内容查阅</a>
<ul>
<li><a href="0220filemanager.html#file_content_1">6.3.1 直接查看文件内容</a>: <a href="0220filemanager.html#cat">cat</a>,
<a href="0220filemanager.html#tac">tac</a>, <a href="0220filemanager.html#nl">nl</a></li>
<li><a href="0220filemanager.html#file_content_2">6.3.2 可翻页查看</a>: <a href="0220filemanager.html#more">more</a>, <a href="0220filemanager.html#less">less</a></li>
<li><a href="0220filemanager.html#file_content_3">6.3.3 数据截取</a>: <a href="0220filemanager.html#head">head</a>, <a href="0220filemanager.html#tail">tail</a></li>
<li><a href="0220filemanager.html#od">6.3.4 非纯文本档: od</a></li>
<li><a href="0220filemanager.html#touch">6.3.5 修改文件时间与建置新档: touch</a></li>
</ul></li>
<li><a href="0220filemanager.html#fileperm">6.4 文件与目录的缺省权限与隐藏权限</a>
<ul>
<li><a href="0220filemanager.html#umask">6.4.1 文件缺省权限:umask</a></li>
<li><a href="0220filemanager.html#attr">6.4.2 文件隐藏属性:</a> <a href="0220filemanager.html#chattr">chattr</a>, <a href="0220filemanager.html#lsattr">lsattr</a><br>
</li><li><a href="0220filemanager.html#suid_sgid_sbit">6.4.3 文件特殊权限</a>:<a href="0220filemanager.html#suid">SUID</a>, <a href="0220filemanager.html#sgid">SGID</a>,
<a href="0220filemanager.html#sbit">SBIT</a>, <a href="0220filemanager.html#suid_set">权限设置</a><br>
</li><li><a href="0220filemanager.html#file">6.4.4 观察文件类型:file</a><br>
</li></ul></li>
<li><a href="0220filemanager.html#file_find">6.5 指令与文件的搜索</a>
<ul>
<li><a href="0220filemanager.html#file_find_cmd">指令文件名的搜索:</a><a href="0220filemanager.html#which">which</a></li>
<li><a href="0220filemanager.html#file_find_file">文件文件名的搜索:</a><a href="0220filemanager.html#whereis">whereis</a>,
<a href="0220filemanager.html#locate">locate / updatedb</a>, <a href="0220filemanager.html#find">find</a></li>
</ul></li>
<li><a href="0220filemanager.html#import">6.6 极重要的复习!权限与指令间的关系</a></li>
<li><a href="0220filemanager.html#hint">6.7 重点回顾</a></li>
<li><a href="0220filemanager.html#ex">6.8 本章习题</a></li>
<li><a href="0220filemanager.html#reference">6.9 参考数据与延伸阅读</a></li>
</ul>
</div>
</div>
<!-- 本文的正式部分 -->
<a id="dir"></a>
<div class="block1">
<h2>6.1 目录与路径</h2>
<p>由前一章<a href="0210filepermission.html">Linux的文件权限与目录配置</a>中透过FHS了解了Linux的『树状目录』概念之后,
接下来就得要实际的来搞定一些基本的路径问题了!这些目录的问题当中,最重要的莫过于前一章也谈过的<a href="0210filepermission.html#dir_path">『绝对路径』与『相对路径』</a>的意义啦!
绝对/相对路径的写法并不相同,要特别注意。此外,当你下达指令时,该指令是透过什么功能来取得的?
这与PATH这个变量有关呢!底下就让我们来谈谈啰!</p>
<a id="dir_pathway"></a>
<div class="block2"><div class="gototop"><a href="0220filemanager.html#top">Top</a></div>
<h2>6.1.1 相对路径与绝对路径</h2>
<p>在开始目录的切换之前,你必须要先了解一下所谓的『<span class="text_import2">路径(PATH)</span>』,
有趣的是:什么是『<span class="text_import2">相对路径</span>』与『<span class="text_import2">绝对路径</span>』?
虽然前一章已经稍微针对这个议题提过一次,不过,这里不厌其烦的再次的强调一下!</p>
<ul>
<li><span class="text_import2">绝对路径</span>:路径的写法『<span class="text_import2">一定由根目录
/ 写起</span>』,例如: /usr/share/doc 这个目录。</li>
<li><span class="text_import2">相对路径</span>:路径的写法『<span class="text_import2">不是由
/ 写起</span>』,例如由 /usr/share/doc 要到 /usr/share/man 底下时,可以写成:
『<span style="font-family:'细明体'">cd
../man</span>』这就是相对路径的写法啦!相对路径意指『相对于目前工作目录的路径!』</li></ul>
<ul class="toplist"><li>相对路径的用途</li></ul>
<p>那么相对路径与绝对路径有什么了不起呀?喝!那可真的是了不起了!假设你写了一个软件,
这个软件共需要三个目录,分别是 etc, bin, man 这三个目录,然而由于不同的人喜欢安装在不同的目录之下,
假设甲安装的目录是 /usr/local/packages/etc, /usr/local/packages/bin 及 /usr/local/packages/man
,不过乙却喜欢安装在 /home/packages/etc, /home/packages/bin, /home/packages/man
这三个目录中,请问如果需要用到绝对路径的话,那么是否很麻烦呢?是的!
如此一来每个目录下的东西就很难对应的起来!这个时候相对路径的写法就显的特别的重要了!</p>
<p>此外,如果你跟鸟哥一样,喜欢将路径的名字写的很长,好让自己知道那个目录是在干什么的,例如:
/cluster/raid/output/taiwan2006/smoke 这个目录,而另一个目录在
/cluster/raid/output/taiwan2006/cctm ,那么我从第一个要到第二个目录去的话,怎么写比较方便?
当然是『 <span style="font-family:'细明体'">cd ../cctm</span> 』比较方便啰!对吧!</p>
<ul class="toplist"><li>绝对路径的用途</li></ul>
<p>但是对于文件名的正确性来说,『<span class="text_import2">绝对路径的正确度要比较好~</span>』。
一般来说,鸟哥会建议你,如果是在写程序 (shell scripts) 来管理系统的条件下,务必使用绝对路径的写法。
怎么说呢?因为绝对路径的写法虽然比较麻烦,但是可以肯定这个写法绝对不会有问题。
如果使用相对路径在程序当中,则可能由于你运行的工作环境不同,导致一些问题的发生。
这个问题在<a href="0430cron.html">工作调度(at, cron, 第十五章)</a>当中尤其重要!这个现象我们在<a href="0340bashshell-scripts.html">十二章、shell script</a>时,会再次的提醒你喔! ^_^</p>
<br></div><br>
<a id="dir_opdir"></a>
<div class="block2"><div class="gototop"><a href="0220filemanager.html#top">Top</a></div>
<h2>6.1.2 目录的相关操作</h2>
<p>我们之前稍微提到变换目录的指令是cd,还有哪些可以进行目录操作的指令呢?
例如创建目录啊、删除目录之类的~还有,得要先知道的,就是有哪些比较特殊的目录呢?
举例来说,底下这些就是比较特殊的目录,得要用力的记下来才行:</p>
<table class="term"><tbody><tr><td class="term"><pre><span class="term_write">. 代表此层目录
.. 代表上一层目录
- 代表前一个工作目录
~ 代表『目前用户身份』所在的家目录
~account 代表 account 这个用户的家目录(account是个帐号名称)</span>
</pre></td></tr></tbody></table>
<p>需要特别注意的是:<span class="text_import2">在所有目录底下都会存在的两个目录,分别是『.』与『..』</span>
分别代表此层与上层目录的意思。那么来思考一下底下这个例题:</p>
<table class="exam"><tbody><tr><td>
例题:<div>
请问在Linux底下,根目录下有没有上层目录(..)存在?
</div>
答:<div>
若使用『 ls -al / 』去查找,可以看到根目录下确实存在 . 与 .. 两个目录,再仔细的查阅,
可发现这两个目录的属性与权限完全一致,这代表<span class="text_import2">根目录的上一层(..)与根目录自己(.)是同一个目录。</span>
</div>
</td></tr></tbody></table>
<p>底下我们就来谈一谈几个常见的处理目录的指令吧:</p>
<ul class="text_import2">
<li>cd:变换目录</li>
<li>pwd:显示目前的目录</li>
<li>mkdir:创建一个新的目录</li>
<li>rmdir:删除一个空的目录</li></ul>
<a id="cd"></a>
<ul class="toplist"><li>cd (change directory, 变换目录)</li></ul>
<p>我们知道dmtsai这个用户的家目录是/home/dmtsai/,而root家目录则是/root/,假设我以root身份在
Linux系统中,那么简单的说明一下这几个特殊的目录的意义是:</p>
<table class="term"><tbody><tr><td class="term"><pre>[dmtsai@study ~]$ <span class="term_command">su -</span> <span class="term_note"># 先切换身份成为 root 看看!</span>
[root@study ~]# <span class="term_command">cd [相对路径或绝对路径]</span>
<span class="term_say"># 最重要的就是目录的绝对路径与相对路径,还有一些特殊目录的符号啰!</span>
[root@study ~]# <span class="term_command">cd ~dmtsai</span>
<span class="term_say"># 代表去到 dmtsai 这个用户的家目录,亦即 /home/dmtsai</span>
[root@study dmtsai]# <span class="term_command">cd ~</span>
<span class="term_say"># 表示回到自己的家目录,亦即是 /root 这个目录</span>
[root@study ~]# <span class="term_command">cd</span>
<span class="term_say"># 没有加上任何路径,也还是代表回到自己家目录的意思喔!</span>
[root@study ~]# <span class="term_command">cd ..</span>
<span class="term_say"># 表示去到目前的上层目录,亦即是 /root 的上层目录的意思;</span>
[root@study /]# <span class="term_command">cd -</span>
<span class="term_say"># 表示回到刚刚的那个目录,也就是 /root 啰~</span>
[root@study ~]# <span class="term_command">cd /var/spool/mail</span>
<span class="term_say"># 这个就是绝对路径的写法!直接指定要去的完整路径名称!</span>
[root@study mail]# <span class="term_command">cd ../postfix</span>
<span class="term_say"># 这个是相对路径的写法,我们由/var/spool/mail 去到/var/spool/postfix 就这样写!</span>
</pre></td></tr></tbody></table>
<p>cd是Change Directory的缩写,这是用来变换工作目录的指令。注意,目录名称与cd指令之间存在一个空格。
一登录Linux系统后,每个帐号都会在自己帐号的家目录中。那回到上一层目录可以用『 cd .. 』。
<span class="text_import2">利用相对路径的写法必须要确认你目前的路径才能正确的去到想要去的目录</span>。例如上表当中最后一个例子,
你必须要确认你是在/var/spool/mail当中,并且知道在/var/spool当中有个mqueue的目录才行啊~
这样才能使用cd ../postfix 去到正确的目录说,否则就要直接输入cd /var/spool/postfix 啰~</p>
<p>其实,我们的提示字符,亦即那个 [root@study ~]# 当中,就已经有指出目前的目录了,
刚登录时会到自己的家目录,而家目录还有一个代码,那就是『 ~ 』符号!
例如上面的例子可以发现,使用『 cd ~ 』可以回到个人的家目录里头去呢!
另外,针对 cd 的使用方法,如果仅输入 cd 时,代表的就是『 cd ~ 』的意思喔~
亦即是会回到自己的家目录啦!而那个『 cd - 』比较难以理解,请自行多做几次练习,就会比较明白了。</p>
<fieldset class="vbirdface"><legend style="font-family: serif; font-size:12pt; color: darkblue;">Tips</legend><img src="./vbird_files/vbird_face.gif" alt="鸟哥的图标" title="鸟哥的图标" style="float: right;"> 还是要一再地提醒,我们的 Linux 的缺省指令列模式 (bash shell) 具有文件补齐功能,
你要常常利用 [tab] 按键来达成你的目录完整性啊!这可是个好习惯啊~可以避免你按错键盘输入错字说~ ^_^
</fieldset><br>
<a id="pwd"></a>
<ul class="toplist"><li>pwd (显示目前所在的目录)</li></ul>
<table class="term"><tbody><tr><td class="term"><pre>[root@study ~]# <span class="term_command">pwd [-P]</span>
<span class="term_say">选项与参数:
-P :显示出确实的路径,而非使用链接 (link) 路径。</span>
<span class="term_hd">范例:单纯显示出目前的工作目录:</span>
[root@study ~]# <span class="term_command">pwd</span>
/root <span class="term_note"><== 显示出目录啦~</span>
<span class="term_hd">范例:显示出实际的工作目录,而非链接档本身的目录名而已</span>
[root@study ~]# <span class="term_command">cd /var/mail</span> <span class="term_note"><==注意,/var/mail是一个链接档</span>
[root@study mail]# <span class="term_command">pwd</span>
/var/mail <span class="term_note"><==列出目前的工作目录</span>
[root@study mail]# <span class="term_command">pwd -P</span>
/var/spool/mail <span class="term_note"><==怎么回事?有没有加 -P 差很多~</span>
[root@study mail]# <span class="term_command">ls -ld /var/mail</span>
<span class="term_write">lrwxrwxrwx.</span> 1 root root 10 May 4 17:51 /var/mail -> spool/mail
<span class="term_say"># 看到这里应该知道为啥了吧?因为 /var/mail 是链接档,链接到 /var/spool/mail
# 所以,加上 pwd -P 的选项后,会不以链接档的数据显示,而是显示正确的完整路径啊!</span>
</pre></td></tr></tbody></table>
<p>pwd是Print Working Directory的缩写,也就是显示目前所在目录的指令,
例如在上个表格最后的目录是/var/mail这个目录,但是提示字符仅显示mail,
如果你想要知道目前所在的目录,可以输入pwd即可。此外,由于很多的套件所使用的目录名称都相同,例如
/usr/local/etc还有/etc,但是通常Linux仅列出最后面那一个目录而已,这个时候你就可以使用pwd
来知道你的所在目录啰!免得搞错目录,结果...</p>
<p>其实有趣的是那个 -P 的选项啦!他可以让我们取得正确的目录名称,而不是以链接档的路径来显示的。
如果你使用的是CentOS 7.x的话,刚刚好/var/mail是/var/spool/mail的链接档,
所以,透过到/var/mail下达pwd -P就能够知道这个选项的意义啰~ ^_^</p>
<a id="mkdir"></a>
<ul class="toplist"><li>mkdir (创建新目录)</li></ul>
<table class="term"><tbody><tr><td class="term"><pre>[root@study ~]# <span class="term_command">mkdir [-mp] 目录名称</span>
<span class="term_say">选项与参数:
-m :设置文件的权限喔!直接设置,不需要看缺省权限 (umask) 的脸色~
-p :帮助你直接将所需要的目录(包含上层目录)递归创建起来!</span>
<span class="term_hd">范例:请到/tmp底下尝试创建数个新目录看看:</span>
[root@study ~]# <span class="term_command">cd /tmp</span>
[root@study tmp]# <span class="term_command">mkdir test</span> <span class="term_note"><==创建一名为 test 的新目录</span>
[root@study tmp]# <span class="term_command">mkdir test1/test2/test3/test4</span>
mkdir: cannot create directory ‘test1/test2/test3/test4’: No such file or directory
<span class="term_say"># 话说,系统告诉我们,没可能创建这个目录啊!就是没有目录才要创建的!见鬼嘛?</span>
[root@study tmp]# <span class="term_command">mkdir -p test1/test2/test3/test4</span>
<span class="term_say"># 原来是要建 test4 上层没先建 test3 之故!加了这个 -p 的选项,可以自行帮你创建多层目录!</span>
<span class="term_hd">范例:创建权限为rwx--x--x的目录</span>
[root@study tmp]# <span class="term_command">mkdir -m 711 test2</span>
[root@study tmp]# <span class="term_command">ls -ld test*</span>
drwxr-xr-x. 2 root root 6 Jun 4 19:03 test
drwxr-xr-x. 3 root root 18 Jun 4 19:04 test1
<span class="term_write">drwx--x--x</span>. 2 root root 6 Jun 4 19:05 test2
<span class="term_say"># 仔细看上面的权限部分,如果没有加上 -m 来强制设置属性,系统会使用缺省属性。
# 那么你的缺省属性为何?这要透过底下介绍的 <a href="0220filemanager.html#umask"><span class="term_say" style="text-decoration: underline;">umask</span></a> 才能了解喔! ^_^</span>
</pre></td></tr></tbody></table>
<p>如果想要创建新的目录的话,那么就使用mkdir (make directory)吧! 不过,在缺省的情况下,
<span class="text_import2">你所需要的目录得一层一层的创建才行</span>!例如:假如你要创建一个目录为
/home/bird/testing/test1,那么首先必须要有 /home 然后 /home/bird ,再来 /home/bird/testing
都必须要存在,才可以创建 /home/bird/testing/test1 这个目录!假如没有 /home/bird/testing
时,就没有办法创建 test1 的目录啰!</p>
<p>不过,现在有个更简单有效的方法啦!那就是加上 -p 这个选项喔!你可以直接下达:『 <span class="text_import2">mkdir -p /home/bird/testing/test1</span> 』
则系统会自动的帮你将 /home, /home/bird, /home/bird/testing 依序的创建起目录!并且,
<span class="text_import2">如果该目录本来就已经存在时,系统也不会显示错误消息喔</span>!挺快乐的吧! ^_^。
不过鸟哥不建议常用-p这个选项,因为担心如果你打错字,那么目录名称就会变的乱七八糟的!</p>
<p>另外,有个地方你必须要先有概念,那就是『缺省权限』的地方。我们可以利用 -m 来强制给予一个新的目录相关的权限,
例如上表当中,我们给予 -m 711 来给予新的目录 drwx--x--x 的权限。不过,如果没有给予 -m 选项时,
那么缺省的新建目录权限又是什么呢?这个跟 <a href="0220filemanager.html#umask">umask</a> 有关,我们在本章后头会加以介绍的。</p>
<a id="rmdir"></a>
<ul class="toplist"><li>rmdir (删除『空』的目录)</li></ul>
<table class="term"><tbody><tr><td class="term"><pre>[root@study ~]# <span class="term_command">rmdir [-p] 目录名称</span>
<span class="term_say">选项与参数:
-p :连同『上层』『空的』目录也一起删除</span>
<span class="term_hd">范例:将于mkdir范例中创建的目录(/tmp底下)删除掉!</span>
[root@study tmp]# <span class="term_command">ls -ld test*</span> <span class="term_note"><==看看有多少目录存在?</span>
drwxr-xr-x. 2 root root 6 Jun 4 19:03 test
drwxr-xr-x. 3 root root 18 Jun 4 19:04 test1
drwx--x--x. 2 root root 6 Jun 4 19:05 test2
[root@study tmp]# <span class="term_command">rmdir test </span> <span class="term_note"><==可直接删除掉,没问题</span>
[root@study tmp]# <span class="term_command">rmdir test1</span> <span class="term_note"><==因为尚有内容,所以无法删除!</span>
rmdir: failed to remove ‘test1’: Directory not empty
[root@study tmp]# <span class="term_command">rmdir -p test1/test2/test3/test4</span>
[root@study tmp]# <span class="term_command">ls -ld test* </span> <span class="term_note"><==您看看,底下的输出中test与test1不见了!</span>
drwx--x--x. 2 root root 6 Jun 4 19:05 test2
<span class="term_say"># 瞧!利用 -p 这个选项,立刻就可以将 test1/test2/test3/test4 一次删除~
# 不过要注意的是,这个 rmdir 仅能『删除空的目录』喔!</span>
</pre></td></tr></tbody></table>
<p>如果想要删除旧有的目录时,就使用rmdir吧!例如将刚刚创建的test杀掉,使用『
rmdir test 』即可!请注意呦!目录需要一层一层的删除才行!而且<span class="text_import2">被删除的目录里面必定不能存在其他的目录或文件!</span>
这也是所谓的空的目录(empty directory)的意思啊!那如果要将所有目录下的东西都杀掉呢?!
这个时候就必须使用『 rm -r test 』啰!不过,还是使用 rmdir 比较不危险!你也可以尝试以 -p
的选项加入,来删除上层的目录喔!</p>
<br></div><br>
<a id="dir_path"></a>
<div class="block2"><div class="gototop"><a href="0220filemanager.html#top">Top</a></div>
<h2>6.1.3 关于运行档路径的变量: $PATH</h2>
<p>经过前一章FHS的说明后,我们知道查阅文件属性的指令ls完整文件名为:/bin/ls(这是绝对路径),
那你会不会觉得很奇怪:『<span class="text_import2">为什么我可以在任何地方运行/bin/ls这个指令呢?</span> 』
为什么我在任何目录下输入 ls 就一定可以显示出一些消息而不会说找不到该 /bin/ls 指令呢?
<span class="text_import2">这是因为环境变量 PATH 的帮助所致呀</span>!</p>
<p>当我们在运行一个指令的时候,举例来说『ls』好了,系统会依照PATH的设置去每个PATH定义的目录下搜索文件名为ls的可运行档,
如果在PATH定义的目录中含有多个文件名为ls的可运行档,那么先搜索到的同名指令先被运行!</p>
<p>现在,请下达『echo $PATH』来看看到底有哪些目录被定义出来了?
echo有『显示、印出』的意思,而 PATH 前面加的 $ 表示后面接的是变量,所以会显示出目前的 PATH !</p>
<table class="term"><tbody><tr><td class="term"><pre><span class="term_hd">范例:先用root的身份列出搜索的路径为何?</span>
[root@study ~]# <span class="term_command">echo $PATH</span>
/usr/local/sbin:/usr/local/bin:/sbin:<span class="term_write">/bin</span>:/usr/sbin:/usr/bin:/root/bin
<span class="term_hd">范例:用dmtsai的身份列出搜索的路径为何?</span>
[root@study ~]# <span class="term_command">exit</span> <span class="term_note"># 由之前的 su - 离开,变回原本的帐号!或再取得一个终端机皆可!</span>
[dmtsai@study ~]$ <span class="term_command">echo $PATH</span>
/usr/local/bin:<span class="term_write">/usr/bin</span>:/usr/local/sbin:/usr/sbin:/home/dmtsai/.local/bin:/home/dmtsai/bin
<span class="term_say"># 记不记得我们前一章说过,目前 /bin 是链接到 /usr/bin 当中的喔!</span>
</pre></td></tr></tbody></table>
<p>PATH(一定是大写)这个变量的内容是由一堆目录所组成的,每个目录中间用冒号(:)来隔开,
每个目录是有『顺序』之分的。仔细看一下上面的输出,你可以发现到无论是root还是dmtsai都有 /bin 或 /usr/bin
这个目录在PATH变量内,所以当然就能够在任何地方运行ls来找到/bin/ls运行档啰!因为 /bin 在 CentOS 7 当中,就是链接到 /usr/bin 去的!
所以这两个目录内容会一模一样!</p>
<p>我们用几个范例来让你了解一下,为什么PATH是那么重要的项目!</p>
<table class="exam"><tbody><tr><td>
例题:<div>
假设你是root,如果你将ls由/bin/ls移动成为/root/ls(可用『mv /bin/ls /root』指令达成),然后你自己本身也在/root目录下,
请问(1)你能不能直接输入ls来运行?(2)若不能,你该如何运行ls这个指令?(3)若要直接输入ls即可运行,又该如何进行?
</div>
答:<div>
由于这个例题的重点是将某个运行档移动到非正规目录去,所以我们先要进行底下的动作才行:(务必先使用 su - 切换成为root的身份)<br>
<table class="term"><tbody><tr><td class="term"><pre>[root@study ~]# <span class="term_command">mv /bin/ls /root</span>
<span class="term_say"># mv 为移动,可将文件在不同的目录间进行移动作业</span>
</pre></td></tr></tbody></table>
(1)接下来不论你在那个目录底下输入任何与ls相关的指令,都没有办法顺利的运行ls了!
也就是说,你不能直接输入ls来运行,<span class="text_import2">因为/root这个目录并不在PATH指定的目录中,
所以,即使你在/root目录下,也不能够搜索到ls这个指令!</span><br><br>
(2)因为这个ls确实存在于/root底下,并不是被删除了!所以我们可以透过使用绝对路径或者是相对路径直接指定这个运行档文件名,
底下的两个方法都能够运行ls这个指令:<br>
<table class="term"><tbody><tr><td class="term"><pre>[root@study ~]# <span class="term_command">/root/ls</span> <span class="term_note"><==直接用绝对路径指定该文件名</span>
[root@study ~]# <span class="term_command">./ls </span> <span class="term_note"><==因为在 /root 目录下,就用./ls来指定</span>
</pre></td></tr></tbody></table>
(3)如果想要让root在任何目录均可运行/root底下的ls,那么就将/root加入PATH当中即可。
加入的方法很简单,就像底下这样:<br>
<table class="term"><tbody><tr><td class="term"><pre>[root@study ~]# <span class="term_command">PATH="${PATH}:/root"</span>
</pre></td></tr></tbody></table>
上面这个作法就能够将/root加入到运行档搜索路径PATH中了!不相信的话请您自行使用『echo $PATH』去查看吧!
<span class="text_import2">另外,除了 $PATH 之外,如果想要更明确的定义出变量的名称,可以使用大括号 ${PATH} 来处理变量的调用喔!</span>
如果确定这个例题进行没有问题了,请将ls搬回/bin底下,不然系统会挂点的!<br>
<table class="term"><tbody><tr><td class="term"><pre>[root@study ~]# <span class="term_command">mv /root/ls /bin</span>
</pre></td></tr></tbody></table>
某些情况下,即使你已经将 ls 搬回 /bin 了,不过系统还是会告知你无法处理 /root/ls 喔!很可能是因为指令参数被缓存的关系。
不要紧张,只要注销 (exit) 再登录 (su -) 就可以继续快乐的使用 ls 了!
</div>
</td></tr></tbody></table><br>
<table class="exam"><tbody><tr><td>
例题:<div>
如果我有两个ls指令在不同的目录中,例如/usr/local/bin/ls与/bin/ls那么当我下达 ls 的时候,哪个ls会被运行?
</div>
答:<div>
那还用说,就找出 ${PATH} 里面哪个目录先被查找,则那个目录下的指令就会被先运行了!所以用 dmtsai 帐号为例,他最先搜索的是 /usr/local/bin,
所以 /usr/local/bin/ls 会先被运行喔!
</div>
</td></tr></tbody></table><br>
<table class="exam"><tbody><tr><td>
例题:<div>
为什么 ${PATH} 搜索的目录不加入本目录(.)?加入本目录的搜索不是也不错?
</div>
答:<div>
如果在PATH中加入本目录(.)后,确实我们就能够在指令所在目录进行指令的运行了。
但是由于你的工作目录并非固定(常常会使用cd来切换到不同的目录),
因此能够运行的指令会有变动(因为每个目录底下的可运行档都不相同嘛!),这对用户来说并非好事。<br><br>
另外,如果有个坏心用户在/tmp底下做了一个指令,因为/tmp是大家都能够写入的环境,所以他当然可以这样做。
假设该指令可能会窃取用户的一些数据,如果你使用root的身份来运行这个指令,那不是很糟糕?
如果这个指令的名称又是经常会被用到的ls时,那『中标』的机率就更高了!<br><br>
所以,<span class="text_import2">为了安全起见,不建议将『.』加入PATH的搜索目录中。</span>
</div>
</td></tr></tbody></table>
<p>而由上面的几个例题我们也可以知道几件事情:</p>
<ul class="text_import2">
<li>不同身份用户缺省的PATH不同,缺省能够随意运行的指令也不同(如root与dmtsai);</li>
<li>PATH是可以修改的;</li>
<li>使用绝对路径或相对路径直接指定某个指令的文件名来运行,会比搜索PATH来的正确;</li>
<li>指令应该要放置到正确的目录下,运行才会比较方便;</li>
<li>本目录(.)最好不要放到PATH当中。</li>
</ul>
<p>对于PATH更详细的『变量』说明,我们会在第三篇的<a href="0320bash.html">bash shell</a>中详细说明的!</p>
<br></div>
</div>
<a id="file_dir_manage"></a>
<div class="block1">
<h2>6.2 文件与目录管理</h2>
<p>谈了谈目录与路径之后,再来讨论一下关于文件的一些基本管理吧!文件与目录的管理上,不外乎『显示属性』、
『拷贝』、『删除文件』及『移动文件或目录』等等,由于文件与目录的管理在 Linux 当中是很重要的,
尤其是每个人自己家目录的数据也都需要注意管理!所以我们来谈一谈有关文件与目录的一些基础管理部分吧!</p>
<a id="ls"></a>
<div class="block2"><div class="gototop"><a href="0220filemanager.html#top">Top</a></div>
<h2>6.2.1 文件与目录的查看: ls</h2>
<table class="term"><tbody><tr><td class="term"><pre>[root@study ~]# <span class="term_command">ls [-aAdfFhilnrRSt] 文件名或目录名称..</span>
[root@study ~]# <span class="term_command">ls [--color={never,auto,always}] 文件名或目录名称..</span>
[root@study ~]# <span class="term_command">ls [--full-time] 文件名或目录名称..</span>
<span class="term_say">选项与参数:
<span style="text-decoration:underline">-a :全部的文件,连同隐藏档( 开头为 . 的文件) 一起列出来(常用)</span>
-A :全部的文件,连同隐藏档,但不包括 . 与 .. 这两个目录
<span style="text-decoration:underline">-d :仅列出目录本身,而不是列出目录内的文件数据(常用)</span>
-f :直接列出结果,而不进行排序 (ls 缺省会以文件名排序!)
-F :根据文件、目录等信息,给予附加数据结构,例如:
*:代表可运行档; /:代表目录; =:代表 socket 文件; |:代表 FIFO 文件;
-h :将文件容量以人类较易读的方式(例如 GB, KB 等等)列出来;
-i :列出 inode 号码,inode 的意义下一章将会介绍;
<span style="text-decoration:underline">-l :长数据串列出,包含文件的属性与权限等等数据;(常用)</span>
-n :列出 UID 与 GID 而非用户与群组的名称 (UID与GID会在帐号管理提到!)
-r :将排序结果反向输出,例如:原本文件名由小到大,反向则为由大到小;
-R :连同子目录内容一起列出来,等于该目录下的所有文件都会显示出来;
-S :以文件容量大小排序,而不是用文件名排序;
-t :依时间排序,而不是用文件名。
--color=never :不要依据文件特性给予颜色显示;
--color=always :显示颜色
--color=auto :让系统自行依据设置来判断是否给予颜色
--full-time :以完整时间模式 (包含年、月、日、时、分) 输出
--time={atime,ctime} :输出 access 时间或改变权限属性时间 (ctime)
而非内容变更时间 (modification time)</span>
</pre></td></tr></tbody></table>
<p>在Linux系统当中,这个 ls 指令可能是最常被运行的吧!因为我们随时都要知道文件或者是目录的相关信息啊~
不过,我们Linux的文件所记录的信息实在是太多了,ls 没有需要全部都列出来呢~
所以,当你只有下达 ls 时,缺省显示的只有:<span class="text_import2">非隐藏档的文件名、
以文件名进行排序及文件名代表的颜色显示</span>如此而已。举例来说,
你下达『 ls /etc 』之后,只有经过排序的文件名以及以蓝色显示目录及白色显示一般文件,如此而已。</p>
<p>那如果我还想要加入其他的显示信息时,可以加入上头提到的那些有用的选项呢~
举例来说,我们之前一直用到的 -l 这个长串显示数据内容,以及将隐藏档也一起列示出来的 -a 选项等等。
底下则是一些常用的范例,实际试做看看:</p>
<table class="term"><tbody><tr><td class="term"><pre><span class="term_hd">范例一:将家目录下的所有文件列出来(含属性与隐藏档)</span>
[root@study ~]# <span class="term_command">ls -al ~</span>
total 56
dr-xr-x---. 5 root root 4096 Jun 4 19:49 <span style="color:#000088">.</span>
dr-xr-xr-x. 17 root root 4096 May 4 17:56 <span style="color:#000088">..</span>
-rw-------. 1 root root 1816 May 4 17:57 anaconda-ks.cfg
-rw-------. 1 root root 6798 Jun 4 19:53 .bash_history
-rw-r--r--. 1 root root 18 Dec 29 2013 .bash_logout
-rw-r--r--. 1 root root 176 Dec 29 2013 .bash_profile
-rw-rw-rw-. 1 root root 176 Dec 29 2013 .bashrc
-rw-r--r--. 1 root root 176 Jun 3 00:04 .bashrc_test
drwx------. 4 root root 29 May 6 00:14 <span style="color:#000088">.cache</span>
drwxr-xr-x. 3 root root 17 May 6 00:14 <span style="color:#000088">.config</span>
<span class="term_say"># 这个时候你会看到以 . 为开头的几个文件,以及目录档 (.) (..) .config 等等,
# 不过,目录档文件名都是以深蓝色显示,有点不容易看清楚就是了。</span>
<span class="term_hd">范例二:承上题,不显示颜色,但在文件名末显示出该文件名代表的类型(type)</span>
[root@study ~]# <span class="term_command">ls -alF --color=never ~</span>
total 56
dr-xr-x---. 5 root root 4096 Jun 4 19:49 ./
dr-xr-xr-x. 17 root root 4096 May 4 17:56 ../
-rw-------. 1 root root 1816 May 4 17:57 anaconda-ks.cfg
-rw-------. 1 root root 6798 Jun 4 19:53 .bash_history
-rw-r--r--. 1 root root 18 Dec 29 2013 .bash_logout
-rw-r--r--. 1 root root 176 Dec 29 2013 .bash_profile
-rw-rw-rw-. 1 root root 176 Dec 29 2013 .bashrc
-rw-r--r--. 1 root root 176 Jun 3 00:04 .bashrc_test
drwx------. 4 root root 29 May 6 00:14 .cache/
drwxr-xr-x. 3 root root 17 May 6 00:14 .config/
<span class="term_say"># 注意看到显示结果的第一行,嘿嘿~知道为何我们会下达类似 ./command
# 之类的指令了吧?因为 ./ 代表的是『目前目录下』的意思啊!至于什么是 FIFO/Socket ?
# 请参考前一章节的介绍啊!另外,那个.bashrc 时间仅写2013,能否知道详细时间?</span>
<span class="term_hd">范例三:完整的呈现文件的修改时间 (modification time)</span>
[root@study ~]# <span class="term_command">ls -al --full-time ~</span>
total 56
dr-xr-x---. 5 root root 4096 2015-06-04 19:49:54.520684829 +0800 .
dr-xr-xr-x. 17 root root 4096 2015-05-04 17:56:38.888000000 +0800 ..
-rw-------. 1 root root 1816 2015-05-04 17:57:02.326000000 +0800 anaconda-ks.cfg
-rw-------. 1 root root 6798 2015-06-04 19:53:41.451684829 +0800 .bash_history
-rw-r--r--. 1 root root 18 2013-12-29 10:26:31.000000000 +0800 .bash_logout
-rw-r--r--. 1 root root 176 2013-12-29 10:26:31.000000000 +0800 .bash_profile
-rw-rw-rw-. 1 root root 176 2013-12-29 10:26:31.000000000 +0800 .bashrc
-rw-r--r--. 1 root root 176 2015-06-03 00:04:16.916684829 +0800 .bashrc_test
drwx------. 4 root root 29 2015-05-06 00:14:56.960764950 +0800 .cache
drwxr-xr-x. 3 root root 17 2015-05-06 00:14:56.975764950 +0800 .config
<span class="term_say"># 请仔细看,上面的『时间』字段变了喔!变成较为完整的格式。
# 一般来说, ls -al 仅列出目前短格式的时间,有时不会列出年份,
# 借由 --full-time 可以查阅到比较正确的完整时间格式啊!</span>
</pre></td></tr></tbody></table>
<p>其实 ls 的用法还有很多,包括查阅文件所在 i-node 号码的 ls -i 选项,以及用来进行文件排序的 -S
选项,还有用来查阅不同时间的动作的 --time=atime 等选项(更多时间说明请参考本章后面<a href="0220filemanager.html#touch">touch</a>的说明)。而这些选项的存在都是因为 Linux
文件系统记录了很多有用的信息的缘故。那么 Linux 的文件系统中,这些与权限、属性有关的数据放在哪里呢?
放在 i-node 里面。关于这部分,我们会在下一章继续为你作比较深入的介绍啊!</p>
<p>无论如何, ls 最常被使用到的功能还是那个 -l 的选项,为此,很多 distribution 在缺省的情况中,
已经将 ll (L 的小写) 设置成为 ls -l 的意思了!其实,那个功能是 <a href="0320bash.html">Bash shell</a> 的 <a href="0320bash.html#alias">alias</a>
功能呢~也就是说,我们直接输入 ll 就等于是输入 ls -l 是一样的~关于这部分,我们会在后续 bash shell
时再次的强调滴~</p>
<br></div><br>
<a id="cprmmv"></a>
<div class="block2"><div class="gototop"><a href="0220filemanager.html#top">Top</a></div>
<h2>6.2.2 复制、删除与移动: cp, rm, mv</h2>
<p>要复制文件,请使用 cp (copy) 这个指令即可~不过, cp 这个指令的用途可多了~
除了单纯的复制之外,还可以创建链接档 (就是捷径啰),比对两文件的新旧而予以更新,
以及复制整个目录等等的功能呢!至于移动目录与文件,则使用 mv (move),
这个指令也可以直接拿来作更名 (rename) 的动作喔!至于移除吗?那就是 rm (remove)
这个指令啰~底下我们就来瞧一瞧先~</p>
<a id="cp"></a>
<ul class="toplist"><li>cp (复制文件或目录)</li></ul>
<table class="term"><tbody><tr><td class="term"><pre>[root@study ~]# <span class="term_command">cp [-adfilprsu] 来源档(source) 目标档(destination)</span>
[root@study ~]# <span class="term_command">cp [options] source1 source2 source3 .... directory</span>
<span class="term_say">选项与参数:
<span style="text-decoration:underline">-a :相当于 -dr --preserve=all 的意思,至于 dr 请参考下列说明;(常用)</span>
-d :若来源档为链接档的属性(link file),则复制链接档属性而非文件本身;
-f :为强制(force)的意思,若目标文件已经存在且无法开启,则移除后再尝试一次;
<span style="text-decoration:underline">-i :若目标档(destination)已经存在时,在覆盖时会先询问动作的进行(常用)</span>
-l :进行硬式链接(hard link)的链接档创建,而非复制文件本身;
<span style="text-decoration:underline">-p :连同文件的属性(权限、用户、时间)一起复制过去,而非使用缺省属性(备份常用);</span>
<span style="text-decoration:underline">-r :递归持续复制,用于目录的复制行为;(常用)</span>
-s :复制成为符号链接档 (symbolic link),亦即『捷径』文件;
-u :destination 比 source 旧才更新 destination,或 destination 不存在的情况下才复制。
--preserve=all :除了 -p 的权限相关参数外,还加入 SELinux 的属性, links, xattr 等也复制了。
最后需要注意的,如果来源档有两个以上,则最后一个目的档一定要是『目录』才行!</span>
</pre></td></tr></tbody></table>
<p>复制(cp)这个指令是非常重要的,不同身份者运行这个指令会有不同的结果产生,尤其是那个-a, -p的选项,
对于不同身份来说,差异则非常的大!底下的练习中,有的身份为root有的身份为一般帐号 (在我这里用 dmtsai 这个帐号),
练习时请特别注意身份的差别喔!好!开始来做复制的练习与观察:</p>
<table class="term"><tbody><tr><td class="term"><pre><span class="term_hd">范例一:用root身份,将家目录下的 .bashrc 复制到 /tmp 下,并更名为 bashrc</span>
[root@study ~]# <span class="term_command">cp ~/.bashrc /tmp/bashrc</span>
[root@study ~]# <span class="term_command">cp -i ~/.bashrc /tmp/bashrc</span>
cp: overwrite `/tmp/bashrc'? <span class="term_command">n</span> <span class="term_note"><==n不覆盖,y为覆盖</span>
<span class="term_say"># 重复作两次动作,由于 /tmp 底下已经存在 bashrc 了,加上 -i 选项后,
# 则在覆盖前会询问用户是否确定!可以按下 n 或者 y 来二次确认呢!</span>
<span class="term_hd">范例二:变换目录到/tmp,并将/var/log/wtmp复制到/tmp且观察属性:</span>
[root@study ~]# <span class="term_command">cd /tmp</span>
[root@study tmp]# <span class="term_command">cp /var/log/wtmp .</span> <span class="term_note"><==想要复制到目前的目录,最后的 . 不要忘</span>
[root@study tmp]# <span class="term_command">ls -l /var/log/wtmp wtmp</span>
<span class="term_write">-rw-rw-r--</span>. 1 root <span class="term_write">utmp</span> 28416 <span class="term_write">Jun 11 18:56</span> /var/log/wtmp
<span class="term_write">-rw-r--r--</span>. 1 root <span class="term_write">root</span> 28416 <span class="term_write">Jun 11 19:01</span> wtmp
<span class="term_say"># 注意上面的特殊字体,在不加任何选项的情况下,文件的某些属性/权限会改变;
# 这是个很重要的特性!要注意喔!还有,连文件创建的时间也不一样了!
# 那如果你想要将文件的所有特性都一起复制过来该怎办?可以加上 -a 喔!如下所示:</span>
[root@study tmp]# <span class="term_command">cp -a /var/log/wtmp wtmp_2</span>
[root@study tmp]# <span class="term_command">ls -l /var/log/wtmp wtmp_2</span>
-rw-rw-r--. 1 root utmp 28416 Jun 11 18:56 /var/log/wtmp
-rw-rw-r--. 1 root utmp 28416 Jun 11 18:56 wtmp_2
<span class="term_say"># 瞭了吧!整个数据特性完全一模一样ㄟ!真是不赖~这就是 -a 的特性!</span>
</pre></td></tr></tbody></table>
<p>这个 cp 的功能很多,由于我们常常会进行一些数据的复制,所以也会常常用到这个指令的。
一般来说,我们如果去复制别人的数据 (当然,该文件你必须要有 read 的权限才行啊! ^_^) 时,
总是希望复制到的数据最后是我们自己的,所以,<span class="text_import2">在缺省的条件中, cp
的来源档与目的档的权限是不同的,目的档的拥有者通常会是指令操作者本身</span>。举例来说,
上面的范例二中,由于我是 root 的身份,因此复制过来的文件拥有者与群组就改变成为 root 所有了!
这样说,可以明白吗?^_^</p>
<p>由于具有这个特性,因此当我们在进行备份的时候,某些需要特别注意的特殊权限文件,
例如密码档 (/etc/shadow) 以及一些设置档,就不能直接以 cp 来复制,而必须要加上 -a 或者是 -p
等等可以完整复制文件权限的选项才行!另外,如果你想要复制文件给其他的用户,
也必须要注意到文件的权限(包含读、写、运行以及文件拥有者等等),
否则,其他人还是无法针对你给予的文件进行修订的动作喔!注意注意!</p>
<table class="term"><tbody><tr><td class="term"><pre><span class="term_hd">范例三:复制 /etc/ 这个目录下的所有内容到 /tmp 底下</span>
[root@study tmp]# <span class="term_command">cp /etc/ /tmp</span>
cp: omitting directory `/etc' <span class="term_note"><== 如果是目录则不能直接复制,要加上 -r 的选项</span>
[root@study tmp]# <span class="term_command">cp -r /etc/ /tmp</span>
<span class="term_say"># 还是要再次的强调喔! -r 是可以复制目录,但是,文件与目录的权限可能会被改变
# 所以,也可以利用『 cp -a /etc /tmp 』来下达指令喔!尤其是在备份的情况下!</span>
<span class="term_hd">范例四:将范例一复制的 bashrc 创建一个链接档 (symbolic link)</span>
[root@study tmp]# <span class="term_command">ls -l bashrc</span>
-rw-r--r--. 1 root root 176 Jun 11 19:01 bashrc <span class="term_note"><==先观察一下文件情况</span>
[root@study tmp]# <span class="term_command">cp -s bashrc bashrc_slink</span>
[root@study tmp]# <span class="term_command">cp -l bashrc bashrc_hlink</span>
[root@study tmp]# <span class="term_command">ls -l bashrc*</span>
-rw-r--r--. <span class="term_write">2</span> root root 176 Jun 11 19:01 bashrc <span class="term_note"><==与源文件案不太一样了!</span>
-rw-r--r--. <span class="term_write">2</span> root root 176 Jun 11 19:01 bashrc_hlink
lrwxrwxrwx. 1 root root 6 Jun 11 19:06 bashrc_slink -> bashrc
</pre></td></tr></tbody></table>
<p>范例四可有趣了!使用 -l 及 -s 都会创建所谓的链接档(link file),但是这两种链接档却有不一样的情况。这是怎么一回事啊?
那个 -l 就是所谓的实体链接(hard link),至于 -s 则是符号链接(symbolic link),
简单来说,bashrc_slink 是一个『捷径』,这个捷径会链接到bashrc去!所以你会看到文件名右侧会有个指向(->)的符号!</p>
<p>至于bashrc_hlink文件与bashrc的属性与权限完全一模一样,与尚未进行链接前的差异则是第二栏的link数由1变成2了!
鸟哥这里先不介绍实体链接,因为实体链接涉及 i-node 的相关知识,我们下一章谈到文件系统(filesystem)时再来讨论这个问题。
</p>
<table class="term"><tbody><tr><td class="term"><pre><span class="term_hd">范例五:若 ~/.bashrc 比 /tmp/bashrc 新才复制过来</span>
[root@study tmp]# <span class="term_command">cp -u ~/.bashrc /tmp/bashrc</span>
<span class="term_say"># 这个 -u 的特性,是在目标文件与来源文件有差异时,才会复制的。
# 所以,比较常被用于『备份』的工作当中喔! ^_^</span>
<span class="term_hd">范例六:将范例四造成的 bashrc_slink 复制成为 bashrc_slink_1 与bashrc_slink_2</span>
[root@study tmp]# <span class="term_command">cp bashrc_slink bashrc_slink_1</span>
[root@study tmp]# <span class="term_command">cp -d bashrc_slink bashrc_slink_2</span>
[root@study tmp]# <span class="term_command">ls -l bashrc bashrc_slink*</span>
-rw-r--r--. 2 root root 176 Jun 11 19:01 bashrc
lrwxrwxrwx. 1 root root 6 Jun 11 19:06 bashrc_slink -> bashrc
-rw-r--r--. 1 root root 176 Jun 11 19:09 bashrc_slink_1 <span class="term_note"><==与源文件案相同</span>
lrwxrwxrwx. 1 root root 6 Jun 11 19:10 bashrc_slink_2 -> bashrc <span class="term_note"><==是链接档!</span>
<span class="term_say"># 这个例子也是很有趣喔!原本复制的是链接档,但是却将链接档的实际文件复制过来了
# 也就是说,如果没有加上任何选项时,cp复制的是源文件案,而非链接档的属性!
# 若要复制链接档的属性,就得要使用 -d 的选项了!如 bashrc_slink_2 所示。</span>
<span class="term_hd">范例七:将家目录的 .bashrc 及 .bash_history 复制到 /tmp 底下</span>
[root@study tmp]# <span class="term_command">cp ~/.bashrc ~/.bash_history /tmp</span>
<span class="term_say"># 可以将多个数据一次复制到同一个目录去!最后面一定是目录!</span>
</pre></td></tr></tbody></table>
<table class="exam"><tbody><tr><td>
例题:<div>
你能否使用 dmtsai 的身份,完整的复制/var/log/wtmp文件到/tmp底下,并更名为dmtsai_wtmp呢?
</div>
答:<div>
实际做看看的结果如下:<br>
<table class="term"><tbody><tr><td class="term"><pre>[dmtsai@study ~]$ <span class="term_command">cp -a /var/log/wtmp /tmp/dmtsai_wtmp</span>
[dmtsai@study ~]$ <span class="term_command">ls -l /var/log/wtmp /tmp/dmtsai_wtmp</span>
-rw-rw-r--. 1 <span class="term_write">dmtsai dmtsai</span> 28416 6月 11 18:56 /tmp/dmtsai_wtmp
-rw-rw-r--. 1 <span class="term_write">root utmp </span> 28416 6月 11 18:56 /var/log/wtmp
</pre></td></tr></tbody></table>
由于 dmtsai 的身份并不能随意修改文件的拥有者与群组,因此虽然能够复制wtmp的相关权限与时间等属性,
但是与拥有者、群组相关的,原本 dmtsai 身份无法进行的动作,即使加上 -a 选项,也是无法达成完整复制权限的!
</div>
</td></tr></tbody></table>
<p>总之,由于 cp 有种种的文件属性与权限的特性,所以,在复制时,你必须要清楚的了解到:</p>
<ul class="text_import2">
<li>是否需要完整的保留来源文件的信息?</li>
<li>来源文件是否为链接档 (symbolic link file)?</li>
<li>来源档是否为特殊的文件,例如 FIFO, socket 等?</li>
<li>来源档是否为目录?</li></ul>
<a id="rm"></a>
<ul class="toplist"><li>rm (移除文件或目录)</li></ul>
<table class="term"><tbody><tr><td class="term"><pre>[root@study ~]# <span class="term_command">rm [-fir] 文件或目录</span>
<span class="term_say">选项与参数:
-f :就是 force 的意思,忽略不存在的文件,不会出现警告消息;
-i :交互模式,在删除前会询问用户是否动作
-r :递归删除啊!最常用在目录的删除了!<span style="text-decoration: underline">这是非常危险的选项!!!</span></span>
<span class="term_hd">范例一:将刚刚在 cp 的范例中创建的 bashrc 删除掉!</span>
[root@study ~]# <span class="term_command">cd /tmp</span>
[root@study tmp]# <span class="term_command">rm -i bashrc</span>
rm: remove regular file `bashrc'? <span class="term_command">y</span>
<span class="term_say"># 如果加上 -i 的选项就会主动询问喔,避免你删除到错误的文件名!</span>
<span class="term_hd">范例二:透过通配符*的帮忙,将/tmp底下开头为bashrc的文件名通通删除:</span>
[root@study tmp]# <span class="term_command">rm -i bashrc*</span>
<span class="term_say"># 注意那个星号,代表的是 0 到无穷多个任意字符喔!很好用的东西!</span>
<span class="term_hd">范例三:将 cp 范例中所创建的 /tmp/etc/ 这个目录删除掉!</span>
[root@study tmp]# <span class="term_command">rmdir /tmp/etc</span>
rmdir: failed to remove '/tmp/etc': Directory not empty <span class="term_note"><== 删不掉啊!因为这不是空的目录!</span>
[root@study tmp]# <span class="term_command">rm -r /tmp/etc</span>
rm: descend into directory `/tmp/etc'? <span class="term_command">y</span>
rm: remove regular file `/tmp/etc/fstab'? <span class="term_command">y</span>
rm: remove regular empty file `/tmp/etc/crypttab'? <span class="term_command">^C</span> <span class="term_note"><== 按下 [ctrl]+c 中断</span>
<span class="term_say">.....(中间省略).....
# 因为身份是 root ,缺省已经加入了 -i 的选项,所以你要一直按 y 才会删除!
# 如果不想要继续按 y ,可以按下『 [ctrl]-c 』来结束 rm 的工作。
# 这是一种保护的动作,如果确定要删除掉此目录而不要询问,可以这样做:</span>
[root@study tmp]# <span class="term_command">\rm -r /tmp/etc</span>
<span class="term_say"># 在指令前加上反斜线,可以忽略掉 alias 的指定选项喔!至于 alias 我们在bash再谈!
# 拜托!这个范例很可怕!你不要删错了!删除 /etc 系统是会挂掉的!</span>
<span class="term_hd">范例四:删除一个带有 - 开头的文件</span>
[root@study tmp]# <span class="term_command">touch ./-aaa-</span> <span class="term_note"><==<a href="0220filemanager.html#touch" style="color: white">touch</a>这个指令可以创建空文件!</span>
[root@study tmp]# <span class="term_command">ls -l </span>
-rw-r--r--. 1 root root 0 Jun 11 19:22 -aaa- <span class="term_note"><==文件大小为0,所以是空文件</span>
[root@study tmp]# <span class="term_command">rm -aaa-</span>
rm: invalid option -- 'a' <span class="term_say"><== 因为 "-" 是选项嘛!所以系统误判了!</span>
Try 'rm ./-aaa-' to remove the file `-aaa-'. <span class="term_say"><== 新的 bash 有给建议的</span>
Try 'rm --help' for more information.
[root@study tmp]# <span class="term_command">rm ./-aaa-</span>
</pre></td></tr></tbody></table>
<p>这是移除的指令(remove),要注意的是,通常在Linux系统下,为了怕文件被 root 误杀,所以很多
distributions 都已经缺省加入 -i 这个选项了!而如果要连目录下的东西都一起杀掉的话,
例如子目录里面还有子目录时,那就要使用 -r 这个选项了!<span class="text_import2">不过,使用『
rm -r 』这个指令之前,请千万注意了,因为该目录或文件『肯定』会被 root
杀掉</span>!因为系统不会再次询问你是否要砍掉呦!所以那是个超级严重的指令下达呦!
得特别注意!不过,如果你确定该目录不要了,那么使用 rm -r 来循环杀掉是不错的方式!</p>
<p>另外,范例四也是很有趣的例子,我们在之前就谈过,文件名最好不要使用 "-" 号开头,
因为 "-" 后面接的是选项,因此,单纯的使用『 rm -aaa- 』系统的指令就会误判啦!
那如果使用后面会谈到的正规表示法时,还是会出问题的!所以,只能用避过首位字符是 "-" 的方法啦!
就是加上本目录『 ./ 』即可!如果 man rm 的话,其实还有一种方法,那就是『 rm -- -aaa-
』也可以啊!</p>
<a id="mv"></a>
<ul class="toplist"><li>mv (移动文件与目录,或更名)</li></ul>
<table class="term"><tbody><tr><td class="term"><pre>[root@study ~]# <span class="term_command">mv [-fiu] source destination</span>
[root@study ~]# <span class="term_command">mv [options] source1 source2 source3 .... directory</span>
<span class="term_say">选项与参数:
-f :force 强制的意思,如果目标文件已经存在,不会询问而直接覆盖;
-i :若目标文件 (destination) 已经存在时,就会询问是否覆盖!
-u :若目标文件已经存在,且 source 比较新,才会更新 (update)</span>
<span class="term_hd">范例一:复制一文件,创建一目录,将文件移动到目录中</span>
[root@study ~]# <span class="term_command">cd /tmp</span>
[root@study tmp]# <span class="term_command">cp ~/.bashrc bashrc</span>
[root@study tmp]# <span class="term_command">mkdir mvtest</span>
[root@study tmp]# <span class="term_command">mv bashrc mvtest</span>
<span class="term_say"># 将某个文件移动到某个目录去,就是这样做!</span>
<span class="term_hd">范例二:将刚刚的目录名称更名为 mvtest2</span>
[root@study tmp]# <span class="term_command">mv mvtest mvtest2</span> <span class="term_note"><== 这样就更名了!简单~</span>
<span class="term_say"># 其实在 Linux 底下还有个有趣的指令,名称为 <span class="term_note_b">rename</span> ,
# 该指令专职进行多个文件名的同时更名,并非针对单一文件名变更,与mv不同。请man rename。</span>
<span class="term_hd">范例三:再创建两个文件,再全部移动到 /tmp/mvtest2 当中</span>
[root@study tmp]# <span class="term_command">cp ~/.bashrc bashrc1</span>
[root@study tmp]# <span class="term_command">cp ~/.bashrc bashrc2</span>
[root@study tmp]# <span class="term_command">mv bashrc1 bashrc2 mvtest2</span>
<span class="term_say"># 注意到这边,如果有多个来源文件或目录,则最后一个目标档一定是『目录!』
# 意思是说,将所有的数据移动到该目录的意思!</span>
</pre></td></tr></tbody></table>
<p>这是搬移 (move) 的意思!当你要移动文件或目录的时后,呵呵!这个指令就很重要啦!
同样的,你也可以使用 -u ( update )来测试新旧文件,看看是否需要搬移啰!
另外一个用途就是『<span class="text_import2">变更文件名</span>!』,我们可以很轻易的使用
mv 来变更一个文件的文件名呢!不过,在 Linux 才有的指令当中,有个 rename ,
可以用来更改大量文件的文件名,你可以利用 man rename 来查阅一下,也是挺有趣的指令喔!</p>
<br></div><br>
<a id="dir_name"></a>
<div class="block2"><div class="gototop"><a href="0220filemanager.html#top">Top</a></div>
<h2>6.2.3 取得路径的文件名称与目录名称</h2>
<p>每个文件的完整文件名包含了前面的目录与最终的文件名,而每个文件名的长度都可以到达 255 个字符耶!
那么你怎么知道那个是文件名?那个是目录名?嘿嘿!就是利用斜线 (/) 来分辨啊!
其实,取得文件名或者是目录名称,一般的用途应该是在写程序的时候用来判断之用的啦~
所以,这部分的指令可以用在第三篇内的 shell scripts 里头喔!
底下我们简单的以几个范例来谈一谈 basename 与 dirname 的用途!</p>
<table class="term"><tbody><tr><td class="term"><pre>[root@study ~]# <span class="term_command">basename /etc/sysconfig/network</span>
network <span class="term_note"><== 很简单!就取得最后的文件名~</span>
[root@study ~]# <span class="term_command">dirname /etc/sysconfig/network</span>
/etc/sysconfig <span class="term_note"><== 取得的变成目录名了!</span>
</pre></td></tr></tbody></table>
<br></div>
</div>
<a id="file_content"></a>
<div class="block1">
<h2>6.3 文件内容查阅</h2>
<p>如果我们要查阅一个文件的内容时,该如何是好呢?这里有相当多有趣的指令可以来分享一下:
最常使用的显示文件内容的指令可以说是 cat 与 more 及 less 了!此外,如果我们要查看一个很大型的文件
(好几百MB时),但是我们只需要后端的几行字而已,那么该如何是好?呵呵!用 tail 呀,此外,
tac 这个指令也可以达到这个目的喔!好了,说说各个指令的用途吧!</p>
<ul class="text_import2" style="font-family:'细明体'">
<li>cat 由第一行开始显示文件内容</li>
<li>tac 从最后一行开始显示,可以看出 tac 是 cat 的倒着写!</li>
<li>nl 显示的时候,顺道输出行号!</li>
<li>more 一页一页的显示文件内容</li>
<li>less 与 more 类似,但是比 more 更好的是,他可以往前翻页!</li>
<li>head 只看头几行</li>
<li>tail 只看尾巴几行</li>
<li>od 以二进位的方式读取文件内容!</li></ul>
<a id="file_content_1"></a>
<div class="block2"><div class="gototop"><a href="0220filemanager.html#top">Top</a></div>
<h2>6.3.1 直接查看文件内容</h2>
<p>直接查阅一个文件的内容可以使用 cat/tac/nl 这几个指令啊!</p>
<a id="cat"></a>
<ul class="toplist"><li>cat (con<span style="text-decoration:underline">cat</span>enate)</li></ul>
<table class="term"><tbody><tr><td class="term"><pre>[root@study ~]# <span class="term_command">cat [-AbEnTv]</span>
<span class="term_say">选项与参数:
-A :相当于 -vET 的集成选项,可列出一些特殊字符而不是空白而已;
-b :列出行号,仅针对非空白行做行号显示,空白行不标行号!
-E :将结尾的断行字符 $ 显示出来;
<span style="text-decoration: underline">-n :打印出行号,连同空白行也会有行号,与 -b 的选项不同;</span>
-T :将 [tab] 按键以 ^I 显示出来;
-v :列出一些看不出来的特殊字符</span>
<span class="term_hd">范例一:检阅 /etc/issue 这个文件的内容</span>
[root@study ~]# <span class="term_command">cat /etc/issue</span>
\S
Kernel \r on an \m
<span class="term_hd">范例二:承上题,如果还要加印行号呢?</span>
[root@study ~]# <span class="term_command">cat -n /etc/issue</span>
1 \S
2 Kernel \r on an \m
3
<span class="term_say"># 所以这个文件有三行!看到了吧!可以印出行号呢!这对于大文件要找某个特定的行时,有点用处!
# 如果不想要编排空白行的行号,可以使用『cat -b /etc/issue』,自己测试看看:</span>
<span class="term_hd">范例三:将 /etc/man_db.conf 的内容完整的显示出来(包含特殊字符)</span>
[root@study ~]# <span class="term_command">cat -A /etc/man_db.conf</span>
# <span class="term_write">$</span>
<span class="term_say">....(中间省略)....</span>
MANPATH_MAP<span class="term_write">^I</span>/bin<span class="term_write">^I^I^I</span>/usr/share/man<span class="term_write">$</span>
MANPATH_MAP<span class="term_write">^I</span>/usr/bin<span class="term_write">^I^I</span>/usr/share/man<span class="term_write">$</span>
MANPATH_MAP<span class="term_write">^I</span>/sbin<span class="term_write">^I^I^I</span>/usr/share/man<span class="term_write">$</span>
MANPATH_MAP<span class="term_write">^I</span>/usr/sbin<span class="term_write">^I^I</span>/usr/share/man<span class="term_write">$</span>
<span class="term_say">.....(底下省略).....</span>
<span class="term_say"># 上面的结果限于篇幅,鸟哥删除掉很多数据了。另外,输出的结果并不会有特殊字体,
# 鸟哥上面的特殊字体是要让您发现差异点在哪里就是了。基本上,在一般的环境中,
# 使用 [tab] 与空白键的效果差不多,都是一堆空白啊!我们无法知道两者的差别。
# 此时使用 cat -A 就能够发现那些空白的地方是啥鬼东西了![tab]会以 ^I 表示,
# 断行字符则是以 $ 表示,所以你可以发现每一行后面都是 $ 啊!不过断行字符
# 在Windows/Linux则不太相同,Windows的断行字符是 ^M$ 啰。
# 这部分我们会在<a href="0310vi.html#tips_dos" style="color:white">第九章 vim 软件</a>的介绍时,再次的说明到喔!</span>
</pre></td></tr></tbody></table>
<p>嘿嘿!Linux 里面有『猫』指令?喔!不是的, cat 是 Concatenate (连续) 的简写,
主要的功能是将一个文件的内容连续的印出在屏幕上面!例如上面的例子中,我们将 /etc/issue
印出来!如果加上 -n 或 -b 的话,则每一行前面还会加上行号呦!</p>
<p>鸟哥个人是比较少用 cat 啦!毕竟当你的文件内容的行数超过 40 行以上,嘿嘿!根本来不及在屏幕上看到结果!
所以,配合等一下要介绍的 more
或者是 less 来运行比较好!此外,如果是一般的 DOS 文件时,就需要特别留意一些奇奇怪怪的符号了,
例如断行与 [tab] 等,要显示出来,就得加入 -A 之类的选项了!</p>
<a id="tac"></a>
<ul class="toplist"><li>tac (反向列示)</li></ul>
<table class="term"><tbody><tr><td class="term"><pre>[root@study ~]# <span class="term_command">tac /etc/issue</span>
Kernel \r on an \m
\S
<span class="term_say"># 嘿嘿!与刚刚上面的范例一比较,是由最后一行先显示喔!</span>
</pre></td></tr></tbody></table>
<p>tac 这个好玩了!怎么说呢?详细的看一下, cat 与 tac ,有没有发现呀!对啦!
tac 刚好是将 cat 反写过来,所以他的功能就跟 cat 相反啦, cat
是由『第一行到最后一行连续显示在屏幕上』,而 tac 则是『
<span class="text_import2">由最后一行到第一行反向在屏幕上显示出来</span> 』,很好玩吧!</p>
<a id="nl"></a>
<ul class="toplist"><li>nl (添加行号打印)</li></ul>
<table class="term"><tbody><tr><td class="term"><pre>[root@study ~]# <span class="term_command">nl [-bnw] 文件</span>
<span class="term_say">选项与参数:
-b :指定行号指定的方式,主要有两种:
-b a :表示不论是否为空行,也同样列出行号(类似 cat -n);
-b t :如果有空行,空的那一行不要列出行号(默认值);
-n :列出行号表示的方法,主要有三种:
-n ln :行号在屏幕的最左方显示;
-n rn :行号在自己字段的最右方显示,且不加 0 ;
-n rz :行号在自己字段的最右方显示,且加 0 ;
-w :行号字段的占用的字符数。</span>
<span class="term_hd">范例一:用 nl 列出 /etc/issue 的内容</span>
[root@study ~]# <span class="term_command">nl /etc/issue</span>
1 \S
2 Kernel \r on an \m
<span class="term_say"># 注意看,这个文件其实有三行,第三行为空白(没有任何字符),
# 因为他是空白行,所以 nl 不会加上行号喔!如果确定要加上行号,可以这样做:</span>
[root@study ~]# <span class="term_command">nl -b a /etc/issue</span>
1 \S
2 Kernel \r on an \m
3
<span class="term_say"># 呵呵!行号加上来啰~那么如果要让行号前面自动补上 0 呢?可这样</span>
[root@study ~]# <span class="term_command">nl -b a -n rz /etc/issue</span>
000001 \S
000002 Kernel \r on an \m
000003
<span class="term_say"># 嘿嘿!自动在自己字段的地方补上 0 了~缺省字段是六位数,如果想要改成 3 位数?</span>
[root@study ~]# <span class="term_command">nl -b a -n rz -w 3 /etc/issue</span>
001 \S
002 Kernel \r on an \m
003
<span class="term_say"># 变成仅有 3 位数啰~</span>
</pre></td></tr></tbody></table>
<p>nl 可以将输出的文件内容自动的加上行号!其缺省的结果与 cat -n 有点不太一样,
nl 可以将行号做比较多的显示设计,包括位数与是否自动补齐 0 等等的功能呢。</p>
<br></div><br>
<a id="file_content_2"></a>
<div class="block2"><div class="gototop"><a href="0220filemanager.html#top">Top</a></div>
<h2>6.3.2 可翻页查看</h2>
<p>前面提到的 nl 与 cat, tac 等等,都是一次性的将数据一口气显示到屏幕上面,那有没有可以进行一页一页翻动的指令啊?
让我们可以一页一页的观察,才不会前面的数据看不到啊~呵呵!有的!那就是 more 与 less 啰~</p>
<a id="more"></a>
<ul class="toplist"><li>more (一页一页翻动)</li></ul>
<table class="term"><tbody><tr><td class="term"><pre>[root@study ~]# <span class="term_command">more /etc/man_db.conf</span>
#
#
# This file is used by the man-db package to configure the man and cat paths.
# It is also used to provide a manpath for those without one by examining
# their PATH environment variable. For details see the manpath(5) man page.
#
<span class="term_say">.....(中间省略).....</span>
<span class="term_white">--More--(28%)</span> <span class="term_note"><== 重点在这一行喔!你的光标也会在这里等待你的指令</span>
</pre></td></tr></tbody></table>
<p>仔细的给他看到上面的范例,如果 more 后面接的文件内容行数大于屏幕输出的行数时,
就会出现类似上面的图标。重点在最后一行,最后一行会显示出目前显示的百分比,
而且还可以在最后一行输入一些有用的指令喔!在 more 这个程序的运作过程中,你有几个按键可以按的:</p>
<ul class="text_import2" style="font-family: '细明体'">
<li>空白键 (space):代表向下翻一页;</li>
<li>Enter :代表向下翻『一行』;</li>
<li>/字符串 :代表在这个显示的内容当中,向下搜索『字符串』这个关键字;</li>
<li>:f :立刻显示出文件名以及目前显示的行数;</li>
<li>q :代表立刻离开 more ,不再显示该文件内容。</li>
<li>b 或 [ctrl]-b :代表往回翻页,不过这动作只对文件有用,对管线无用。</li>
</ul>
<p>要离开 more 这个指令的显示工作,可以按下 q 就能够离开了。而要向下翻页,就使用空白键即可。
比较有用的是搜索字符串的功能,举例来说,我们使用『 more /etc/man_db.conf 』来观察该文件,
若想要在该文件内搜索 MANPATH 这个字符串时,可以这样做:</p>
<table class="term"><tbody><tr><td class="term"><pre>[root@study ~]# <span class="term_command">more /etc/man_db.conf</span>
#
#
# This file is used by the man-db package to configure the man and cat paths.
# It is also used to provide a manpath for those without one by examining
# their PATH environment variable. For details see the manpath(5) man page.
#
<span class="term_say">....(中间省略)....</span>
<span class="term_write">/MANPATH</span> <span class="term_note"><== 输入了 / 之后,光标就会自动跑到最底下一行等待输入!</span>
</pre></td></tr></tbody></table>
<p>如同上面的说明,输入了 / 之后,光标就会跑到最底下一行,并且等待你的输入,
你输入了字符串并按下[enter]之后,嘿嘿! more 就会开始向下搜索该字符串啰~而重复搜索同一个字符串,
可以直接按下 n 即可啊!最后,不想要看了,就按下 q 即可离开 more 啦!</p>
<a id="less"></a>
<ul class="toplist"><li>less (一页一页翻动)</li></ul>
<table class="term"><tbody><tr><td class="term"><pre>[root@study ~]# <span class="term_command">less /etc/man_db.conf</span>
#
#
# This file is used by the man-db package to configure the man and cat paths.
# It is also used to provide a manpath for those without one by examining
# their PATH environment variable. For details see the manpath(5) man page.
#
<span class="term_say">.....(中间省略).....</span>
:<span class="term_white"> </span> <span class="term_note"><== 这里可以等待你输入指令!</span>
</pre></td></tr></tbody></table>
<p>less 的用法比起 more 又更加的有弹性,怎么说呢?在 more 的时候,我们并没有办法向前面翻,
只能往后面看,但若使用了 less 时,呵呵!就可以使用 [pageup] [pagedown]
等按键的功能来往前往后翻看文档,你瞧,是不是更容易使用来观看一个文件的内容了呢!</p>
<p>除此之外,在 less 里头可以拥有更多的『搜索』功能喔!不止可以向下搜索,也可以向上搜索~
实在是很不错用~基本上,可以输入的指令有:</p>
<ul class="text_import2" style="font-family: '细明体'">
<li>空白键 :向下翻动一页;</li>
<li>[pagedown]:向下翻动一页;</li>
<li>[pageup] :向上翻动一页;</li>
<li>/字符串 :向下搜索『字符串』的功能;</li>
<li>?字符串 :向上搜索『字符串』的功能;</li>
<li>n :重复前一个搜索 (与 / 或 ? 有关!)</li>
<li>N :反向的重复前一个搜索 (与 / 或 ? 有关!)</li>
<li>g :前进到这个数据的第一行去;</li>
<li>G :前进到这个数据的最后一行去 (注意大小写);</li>
<li>q :离开 less 这个程序;</li></ul>
<p>查阅文件内容还可以进行搜索的动作~瞧~ less 是否很不错用啊!
其实 less 还有很多的功能喔!详细的使用方式请使用 man less 查找一下啊! ^_^</p>
<p>你是否会觉得 less 使用的画面与环境与 <a href="0160startlinux.html#manual_man">man page</a>
非常的类似呢?没错啦!因为man这个指令就是调用 less 来显示说明文档的内容的!
现在你是否觉得 less 很重要呢? ^_^</p>
<br></div><br>
<a id="file_content_3"></a>
<div class="block2"><div class="gototop"><a href="0220filemanager.html#top">Top</a></div>
<h2>6.3.3 数据截取</h2>
<p>我们可以将输出的数据作一个最简单的截取,那就是取出文件前面几行 (head) 或取出后面几行 (tail) 文本的功能。
不过,要注意的是, head 与 tail 都是以『行』为单位来进行数据截取的喔!</p>
<a id="head"></a>
<ul class="toplist"><li>head (取出前面几行)</li></ul>
<table class="term"><tbody><tr><td class="term"><pre>[root@study ~]# <span class="term_command">head [-n number] 文件 </span>
<span class="term_say">选项与参数:
-n :后面接数字,代表显示几行的意思</span>
[root@study ~]# <span class="term_command">head /etc/man_db.conf</span>
<span class="term_say"># 缺省的情况中,显示前面十行!若要显示前 20 行,就得要这样:</span>
[root@study ~]# <span class="term_command">head -n 20 /etc/man_db.conf</span>
<span class="term_hd">范例:如果后面100行的数据都不打印,只打印/etc/man_db.conf的前面几行,该如何是好?</span>
[root@study ~]# <span class="term_command">head -n -100 /etc/man_db.conf</span>
</pre></td></tr></tbody></table>
<p>head 的英文意思就是『头』啦,那么这个东西的用法自然就是显示出一个文件的前几行啰!
没错!就是这样!若没有加上 -n 这个选项时,缺省只显示十行,若只要一行呢?那就加入『
head -n 1 filename 』即可!</p>
<p>另外那个 -n 选项后面的参数较有趣,如果接的是负数,例如上面范例的-n -100时,代表列前的所有行数,
但不包括后面100行。举例来说 CentOS 7.1 的 /etc/man_db.conf 共有131行,则上述的指令『head -n -100 /etc/man_db.conf』
就会列出前面31行,后面100行不会打印出来了。这样说,比较容易懂了吧? ^_^</p>
<a id="tail"></a>
<ul class="toplist"><li>tail (取出后面几行)</li></ul>
<table class="term"><tbody><tr><td class="term"><pre>[root@study ~]# <span class="term_command">tail [-n number] 文件 </span>
<span class="term_say">选项与参数:
-n :后面接数字,代表显示几行的意思
-f :表示持续侦测后面所接的文件名,要等到按下[ctrl]-c才会结束tail的侦测</span>
[root@study ~]# <span class="term_command">tail /etc/man_db.conf</span>
<span class="term_say"># 缺省的情况中,显示最后的十行!若要显示最后的 20 行,就得要这样:</span>
[root@study ~]# <span class="term_command">tail -n 20 /etc/man_db.conf</span>
<span class="term_hd">范例一:如果不知道/etc/man_db.conf有几行,却只想列出100行以后的数据时?</span>
[root@study ~]# <span class="term_command">tail -n +100 /etc/man_db.conf</span>
<span class="term_hd">范例二:持续侦测/var/log/messages的内容</span>
[root@study ~]# <span class="term_command">tail -f /var/log/messages</span>
<span class="term_note"><==要等到输入[ctrl]-c之后才会离开tail这个指令的侦测!</span>
</pre></td></tr></tbody></table>
<p>有 head 自然就有 tail ( 尾巴 ) 啰!没错!这个 tail 的用法跟 head
的用法差不多类似,只是显示的是后面几行就是了!缺省也是显示十行,若要显示非十行,就加
-n number 的选项即可。</p>
<p>范例一的内容就有趣啦!其实与head -n -xx有异曲同工之妙。当下达『tail -n +100 /etc/man_db.conf』
代表该文件从100行以后都会被列出来,同样的,在man_db.conf共有131行,因此第100~131行就会被列出来啦!
前面的99行都不会被显示出来喔!</p>
<p>至于范例二中,由于/var/log/messages随时会有数据写入,你想要让该文件有数据写入时就立刻显示到屏幕上,
就利用 -f 这个选项,他可以一直侦测/var/log/messages这个文件,新加入的数据都会被显示到屏幕上。
直到你按下[ctrl]-c才会离开tail的侦测喔!由于 messages 必须要 root 权限才能看,所以该范例得要使用 root 来查找喔!</p>
<table class="exam"><tbody><tr><td>
例题:<div>
假如我想要显示 /etc/man_db.conf 的第 11 到第 20 行呢?
</div>
答:<div>
这个应该不算难,想一想,在第 11 到第 20 行,那么我取前 20 行,再取后十行,所以结果就是:『
head -n 20 /etc/man_db.conf | tail -n 10 』,这样就可以得到第 11 到第 20 行之间的内容了!<br><br>
这两个指令中间有个管线 (|) 的符号存在,这个管线的意思是:『<span class="text_import2">前面的指令所输出的消息,请透过管线交由后续的指令继续使用</span>』的意思。
所以, head -n 20 /etc/man_db.conf 会将文件内的 20 行取出来,但不输出到屏幕上,而是转交给后续的 tail 指令继续处理。
因此 tail 『不需要接文件名』,因为 tail 所需要的数据是来自于 head 处理后的结果!这样说,有没有理解?<br><br>
更多的管线命令,我们会在第三篇继续解释的!
</div>
</td></tr></tbody></table><br>
<table class="exam"><tbody><tr><td>
例题:<div>
承上一题,那如果我想要列出正确的行号呢?就是屏幕上仅列出 /etc/man_db.conf 的第 11 到第 20 行,且有行号存在?
</div>
答:<div>
我们可以透过 cat -n 来带出行号,然后再透过 head/tail 来截取数据即可!所以就变成如下的模样了:<br>
cat -n /etc/man_db.conf | head -n 20 | tail -n 10
</div>
</td></tr></tbody></table><br>
<br></div><br>
<a id="od"></a>
<div class="block2"><div class="gototop"><a href="0220filemanager.html#top">Top</a></div>
<h2>6.3.4 非纯文本档: od</h2>
<p>我们上面提到的,都是在查阅纯文本档的内容。那么万一我们想要查阅非文本档,举例来说,例如 /usr/bin/passwd 这个运行档的内容时,
又该如何去读出信息呢?事实上,由于运行档通常是 binary file ,使用上头提到的指令来读取他的内容时,
确实会产生类似乱码的数据啊!那怎么办?没关系,我们可以利用 od 这个指令来读取喔!</p>
<table class="term"><tbody><tr><td class="term"><pre>[root@study ~]# <span class="term_command">od [-t TYPE] 文件</span>
<span class="term_say">选项或参数:
-t :后面可以接各种『类型 (TYPE)』的输出,例如:
a :利用缺省的字符来输出;
c :使用 ASCII 字符来输出
d[size] :利用十进位(decimal)来输出数据,每个整数占用 size bytes ;
f[size] :利用浮点数值(floating)来输出数据,每个数占用 size bytes ;
o[size] :利用八进位(octal)来输出数据,每个整数占用 size bytes ;
x[size] :利用十六进位(hexadecimal)来输出数据,每个整数占用 size bytes ;</span>
<span class="term_hd">范例一:请将/usr/bin/passwd的内容使用ASCII方式来展现!</span>
[root@study ~]# <span class="term_command">od -t c /usr/bin/passwd</span>
0000000 177 E L F 002 001 001 \0 \0 \0 \0 \0 \0 \0 \0 \0
0000020 003 \0 > \0 001 \0 \0 \0 364 3 \0 \0 \0 \0 \0 \0
0000040 @ \0 \0 \0 \0 \0 \0 \0 x e \0 \0 \0 \0 \0 \0
0000060 \0 \0 \0 \0 @ \0 8 \0 \t \0 @ \0 035 \0 034 \0
0000100 006 \0 \0 \0 005 \0 \0 \0 @ \0 \0 \0 \0 \0 \0 \0
<span class="term_say">.....(后面省略)....
# 最左边第一栏是以 8 进位来表示bytes数。以上面范例来说,第二栏0000020代表开头是
# 第 16 个 byes (2x8) 的内容之意。</span>
<span class="term_hd">范例二:请将/etc/issue这个文件的内容以8进位列出保存值与ASCII的对照表</span>
[root@study ~]# <span class="term_command">od -t oCc /etc/issue</span>
0000000 134 123 012 113 145 162 156 145 154 040 134 162 040 157 156 040
\ S \n K e r n e l \ r o n
0000020 141 156 040 134 155 012 012
a n \ m \n \n
0000027
<span class="term_say"># 如上所示,可以发现每个字符可以对应到的数值为何!要注意的是,该数值是 8 进位喔!
# 例如 S 对应的记录数值为 123 ,转成十进位:1x8^2+2x8+3=83。</span>
</pre></td></tr></tbody></table>
<p>利用这个指令,可以将 data file 或者是 binary file 的内容数据给他读出来喔!
虽然读出的来数值缺省是使用非文本档,亦即是 16 进位的数值来显示的,
不过,我们还是可以透过 -t c 的选项与参数来将数据内的字符以 ASCII 类型的字符来显示,
虽然对于一般用户来说,这个指令的用处可能不大,但是对于工程师来说,
这个指令可以将 binary file 的内容作一个大致的输出,他们可以看得出东西的啦~ ^_^</p>
<p>如果对纯文本档使用这个指令,你甚至可以发现到 ASCII 与字符的对照表!非常有趣!
例如上述的范例二,你可以发现到每个英文本 S 对照到的数字都是 123,转成十进位你就能够发现那是 83 啰!
如果你有任何编程语言的书,拿出来对照一下 ASCII 的对照表,就能够发现真是正确啊!呵呵!</p>
<table class="exam"><tbody><tr><td>
例题:
<div>我不想找 google,想要立刻找到 password 这几个字的 ASCII 对照,该如何透过 od 来判断?</div>
答:<div>
其实可以透过刚刚上一个小节谈到的管线命令来处理!如下所示:<br>
echo password | od -t oCc<br>
echo 可以在屏幕上面显示任何信息,而这个信息不由屏幕输出,而是传给 od 去继续处理!就可以得到 ASCII code 对照啰!
</div></td></tr></tbody></table><br>
<br></div><br>
<a id="touch"></a>
<div class="block2"><div class="gototop"><a href="0220filemanager.html#top">Top</a></div>
<h2>6.3.5 修改文件时间或建置新档: touch</h2>
<p>我们在 <a href="0220filemanager.html#ls">ls 这个指令的介绍</a>时,有稍微提到每个文件在linux底下都会记录许多的时间参数,
其实是有三个主要的变动时间,那么三个时间的意义是什么呢?</p>
<ul class="text_import2">
<li><b>modification time (mtime)</b>:<br>
当该文件的『内容数据』变更时,就会更新这个时间!内容数据指的是文件的内容,而不是文件的属性或权限喔!<br><br></li>
<li><b>status time (ctime)</b>:<br>
当该文件的『状态 (status)』改变时,就会更新这个时间,举例来说,像是权限与属性被更改了,都会更新这个时间啊。
<br><br></li>
<li><b>access time (atime)</b>:<br>
当『该文件的内容被取用』时,就会更新这个读取时间 (access)。举例来说,我们使用 cat 去读取 /etc/man_db.conf ,
就会更新该文件的 atime 了。</li></ul>
<p>这是个挺有趣的现象,举例来说,我们来看一看你自己的 /etc/man_db.conf 这个文件的时间吧!</p>
<table class="term"><tbody><tr><td class="term"><pre>[root@study ~]# <span class="term_command">date; ls -l /etc/man_db.conf ; ls -l --time=atime /etc/man_db.conf ; \</span>
> <span class="term_command">ls -l --time=ctime /etc/man_db.conf</span> <span class="term_note"># 这两行其实是同一行喔!用分号隔开</span>
Tue Jun 16 00:43:17 CST 2015 <span class="term_note"># 目前的时间啊!</span>
-rw-r--r--. 1 root root 5171 <span class="term_write">Jun 10 2014</span> /etc/man_db.conf <span class="term_note"># 在 2014/06/10 创建的内容(mtime)</span>
-rw-r--r--. 1 root root 5171 <span class="term_write">Jun 15 23:46</span> /etc/man_db.conf <span class="term_note"># 在 2015/06/15 读取过内容(atime)</span>