第 3 堂課:檔案管理與 vim 初探

http://linux.vbird.org/linux_basic_train/unit03.php

3.1:檔案管理

3.1.1:目錄的建立與刪除

前往 /dev/shm 目錄

[root@mail ~]# cd /dev/shm
[root@mail shm]#

建立名為 class3 的目錄

[root@mail shm]# mkdir class3

觀察 /dev/shm/class3 這個目錄的內容,並請說明內部有沒有其他檔案 (註:使用 ll 加上顯示隱藏檔的選項)

[root@mail shm]# cd class3/
[root@mail class3]# ll -a
total 0
drwxr-xr-x. 2 root root 40 Apr 23 10:08 .
drwxrwxrwt. 4 root root 80 Apr 23 10:08 ..

透過 cp /etc/hosts /dev/shm/class3 將檔案複製到該目錄內,並觀察 class3 目錄的內容

[root@mail class3]# cp -r /etc/hosts /dev/shm/class3
[root@mail class3]# ll
total 4
-rw-r--r--. 1 root root 191 Apr 23 10:52 hosts

使用 rmdir /dev/shm/class3 嘗試刪除該目錄,並說明可以或不行刪除該目錄的原因

[root@mail class3]# rmdir /dev/shm/class3
rmdir: failed to remove '/dev/shm/class3': Directory not empty

#有資料的資料夾無法刪除

承上一個例題,進入到 /dev/shm/class3 當中,並且使用 rm 刪除掉所有該目錄下的檔案 (非隱藏檔)

[root@mail class3]# cd /dev/shm/class3
[root@mail class3]# rm hosts 
rm: remove regular file 'hosts'? y

回到 /dev/shm 當中,此時能否使用 rmdir 刪除 class3 目錄?為什麼?

[root@mail class3]# rmdir /dev/shm/class3

#class3沒資料,所以刪除成功

3.1.2:萬用字元

列出 /etc/ 底下含有 5 個字元的檔名

[root@mail /]# ll -d /etc/?????

列出 /etc/ 底下含有數字在內的檔名

[root@mail /]# ll -d /etc/*[0-9]*

3.1.3:檔案及目錄的複製與刪除

先進入 /dev/shm ,同時觀察目錄下有無名為 rc1.d 的檔名

[root@mail /]# cd /dev/shm
[root@mail shm]# ll | grep rc1.d

使用『 cp -r /etc/rc.d/rc1.d rc1.d 』將 rc1.d 複製到本目錄下,然後使用 ll 與 ll rc1.d 觀察該目錄

[root@mail shm]# cp -r /etc/rc.d/rc1.d rc1.d
[root@mail shm]# ll
total 0
drwxr-xr-x. 3 root root 60 Apr 22 13:38 backup
drwxr-xr-x. 2 root root 80 Apr 23 11:20 rc1.d
[root@mail shm]# ll rc1.d
total 0
lrwxrwxrwx. 1 root root 20 Apr 23 11:20 K50netconsole -> ../init.d/netconsole
lrwxrwxrwx. 1 root root 17 Apr 23 11:20 K90network -> ../init.d/network

重新執行上述複製的指令一次,然後使用 ll rc1.d ,觀察一下有什麼變化?

[root@mail shm]# cp -r /etc/rc.d/rc1.d rc1.d
[root@mail shm]# ll rc1.d
total 0
lrwxrwxrwx. 1 root root 20 Apr 23 11:20 K50netconsole -> ../init.d/netconsole
lrwxrwxrwx. 1 root root 17 Apr 23 11:20 K90network -> ../init.d/network
drwxr-xr-x. 2 root root 80 Apr 23 11:21 rc1.d

進入 /dev/shm ,觀察到前一個例題 /dev/shm/rc1.d 的目錄存在後,請將它刪除

[root@mail shm]# rm -rf rc1.d

3.1.4:特殊檔名的處理方式

將剛剛建立的 -newdir, -newdir2 刪除

[root@mail shm]# rm -rf ./-newdir*

3.1.5:隱藏檔的觀察與檔案類型的觀察

觀察 /etc/rc0.d 及 /etc/rc.d/rc0.d 的檔案類型為何?

[root@mail shm]# file /etc/rc0.d /etc/rc.d/rc0.d
/etc/rc0.d:      symbolic link to `rc.d/rc0.d'
/etc/rc.d/rc0.d: directory

3.1.6:檔名的移動與更名

讓 student 回到家目錄

[root@mail shm]# su - student
Last login: Fri Apr 22 14:23:05 CST 2016 on pts/0
[student@mail ~]$ cd ~

將 /etc/rc3.d 複製到本目錄

[student@mail ~]$ cp -r /etc/rc3.d .

該目錄移動錯誤,請將本目錄的 rc3.d 移動到 /dev/shm

[student@mail ~]$ mv rc3.d /dev/shm

檔名依舊錯誤,請將 /dev/shm 底下的 rc3.d 更名為 init3.d

[student@mail ~]$ cd /dev/shm
[student@mail ~]$ mv rc3.d init3.d

3.1.7:大量建置空白檔案的方式

我需要在 /dev/shm/testing 目錄下建立名為 mytest_XX_YY_ZZ 的檔案,其中 XX 為 jan, feb, mar, apr 四個資料, YY 為 one, two, three 三個資料,而 ZZ 為 a1, b1, c1 三個資料,如何使用一個指令就建立出上述的 36 個檔案?

[student@mail ~]$ mkdir /dev/shm/testing
[student@mail ~]$ cd /dev/shm/testing
[student@mail testing]$ touch mytest_{jan,feb,mar,apr}_{one,two,three}_{a1,b1,c1}
[student@mail testing]$ ll
總計 0
-rw-rw-r--. 1 student student 0  4月 23 16:41 mytest_apr_one_a1
-rw-rw-r--. 1 student student 0  4月 23 16:41 mytest_apr_one_b1
-rw-rw-r--. 1 student student 0  4月 23 16:41 mytest_apr_one_c1
-rw-rw-r--. 1 student student 0  4月 23 16:41 mytest_apr_three_a1
-rw-rw-r--. 1 student student 0  4月 23 16:41 mytest_apr_three_b1
-rw-rw-r--. 1 student student 0  4月 23 16:41 mytest_apr_three_c1
-rw-rw-r--. 1 student student 0  4月 23 16:41 mytest_apr_two_a1
-rw-rw-r--. 1 student student 0  4月 23 16:41 mytest_apr_two_b1
-rw-rw-r--. 1 student student 0  4月 23 16:41 mytest_apr_two_c1
-rw-rw-r--. 1 student student 0  4月 23 16:41 mytest_feb_one_a1
-rw-rw-r--. 1 student student 0  4月 23 16:41 mytest_feb_one_b1
-rw-rw-r--. 1 student student 0  4月 23 16:41 mytest_feb_one_c1
-rw-rw-r--. 1 student student 0  4月 23 16:41 mytest_feb_three_a1
-rw-rw-r--. 1 student student 0  4月 23 16:41 mytest_feb_three_b1
-rw-rw-r--. 1 student student 0  4月 23 16:41 mytest_feb_three_c1
-rw-rw-r--. 1 student student 0  4月 23 16:41 mytest_feb_two_a1
-rw-rw-r--. 1 student student 0  4月 23 16:41 mytest_feb_two_b1
-rw-rw-r--. 1 student student 0  4月 23 16:41 mytest_feb_two_c1
-rw-rw-r--. 1 student student 0  4月 23 16:41 mytest_jan_one_a1
-rw-rw-r--. 1 student student 0  4月 23 16:41 mytest_jan_one_b1
-rw-rw-r--. 1 student student 0  4月 23 16:41 mytest_jan_one_c1
-rw-rw-r--. 1 student student 0  4月 23 16:41 mytest_jan_three_a1
-rw-rw-r--. 1 student student 0  4月 23 16:41 mytest_jan_three_b1
-rw-rw-r--. 1 student student 0  4月 23 16:41 mytest_jan_three_c1
-rw-rw-r--. 1 student student 0  4月 23 16:41 mytest_jan_two_a1
-rw-rw-r--. 1 student student 0  4月 23 16:41 mytest_jan_two_b1
-rw-rw-r--. 1 student student 0  4月 23 16:41 mytest_jan_two_c1
-rw-rw-r--. 1 student student 0  4月 23 16:41 mytest_mar_one_a1
-rw-rw-r--. 1 student student 0  4月 23 16:41 mytest_mar_one_b1
-rw-rw-r--. 1 student student 0  4月 23 16:41 mytest_mar_one_c1
-rw-rw-r--. 1 student student 0  4月 23 16:41 mytest_mar_three_a1
-rw-rw-r--. 1 student student 0  4月 23 16:41 mytest_mar_three_b1
-rw-rw-r--. 1 student student 0  4月 23 16:41 mytest_mar_three_c1
-rw-rw-r--. 1 student student 0  4月 23 16:41 mytest_mar_two_a1
-rw-rw-r--. 1 student student 0  4月 23 16:41 mytest_mar_two_b1
-rw-rw-r--. 1 student student 0  4月 23 16:41 mytest_mar_two_c1

我需要在 /dev/shm/student/ 目錄下,建立檔名為 4070C001 到 4070C050 的檔案,如何使用一個指令來完成這 50 個檔案的建置?

[student@mail testing]$ mkdir /dev/shm/student
[student@mail testing]$ cd /dev/shm/student
[student@mail student]$ touch 4070C0{01..50}
[student@mail student]$ ll
總計 0
-rw-rw-r--. 1 student student 0  4月 23 16:43 4070C001
-rw-rw-r--. 1 student student 0  4月 23 16:43 4070C002
-rw-rw-r--. 1 student student 0  4月 23 16:43 4070C003
-rw-rw-r--. 1 student student 0  4月 23 16:43 4070C004
-rw-rw-r--. 1 student student 0  4月 23 16:43 4070C005
-rw-rw-r--. 1 student student 0  4月 23 16:43 4070C006
-rw-rw-r--. 1 student student 0  4月 23 16:43 4070C007
-rw-rw-r--. 1 student student 0  4月 23 16:43 4070C008
-rw-rw-r--. 1 student student 0  4月 23 16:43 4070C009
-rw-rw-r--. 1 student student 0  4月 23 16:43 4070C010
-rw-rw-r--. 1 student student 0  4月 23 16:43 4070C011
-rw-rw-r--. 1 student student 0  4月 23 16:43 4070C012
-rw-rw-r--. 1 student student 0  4月 23 16:43 4070C013
-rw-rw-r--. 1 student student 0  4月 23 16:43 4070C014
-rw-rw-r--. 1 student student 0  4月 23 16:43 4070C015
-rw-rw-r--. 1 student student 0  4月 23 16:43 4070C016
-rw-rw-r--. 1 student student 0  4月 23 16:43 4070C017
-rw-rw-r--. 1 student student 0  4月 23 16:43 4070C018
-rw-rw-r--. 1 student student 0  4月 23 16:43 4070C019
-rw-rw-r--. 1 student student 0  4月 23 16:43 4070C020
-rw-rw-r--. 1 student student 0  4月 23 16:43 4070C021
-rw-rw-r--. 1 student student 0  4月 23 16:43 4070C022
-rw-rw-r--. 1 student student 0  4月 23 16:43 4070C023
-rw-rw-r--. 1 student student 0  4月 23 16:43 4070C024
-rw-rw-r--. 1 student student 0  4月 23 16:43 4070C025
-rw-rw-r--. 1 student student 0  4月 23 16:43 4070C026
-rw-rw-r--. 1 student student 0  4月 23 16:43 4070C027
-rw-rw-r--. 1 student student 0  4月 23 16:43 4070C028
-rw-rw-r--. 1 student student 0  4月 23 16:43 4070C029
-rw-rw-r--. 1 student student 0  4月 23 16:43 4070C030
-rw-rw-r--. 1 student student 0  4月 23 16:43 4070C031
-rw-rw-r--. 1 student student 0  4月 23 16:43 4070C032
-rw-rw-r--. 1 student student 0  4月 23 16:43 4070C033
-rw-rw-r--. 1 student student 0  4月 23 16:43 4070C034
-rw-rw-r--. 1 student student 0  4月 23 16:43 4070C035
-rw-rw-r--. 1 student student 0  4月 23 16:43 4070C036
-rw-rw-r--. 1 student student 0  4月 23 16:43 4070C037
-rw-rw-r--. 1 student student 0  4月 23 16:43 4070C038
-rw-rw-r--. 1 student student 0  4月 23 16:43 4070C039
-rw-rw-r--. 1 student student 0  4月 23 16:43 4070C040
-rw-rw-r--. 1 student student 0  4月 23 16:43 4070C041
-rw-rw-r--. 1 student student 0  4月 23 16:43 4070C042
-rw-rw-r--. 1 student student 0  4月 23 16:43 4070C043
-rw-rw-r--. 1 student student 0  4月 23 16:43 4070C044
-rw-rw-r--. 1 student student 0  4月 23 16:43 4070C045
-rw-rw-r--. 1 student student 0  4月 23 16:43 4070C046
-rw-rw-r--. 1 student student 0  4月 23 16:43 4070C047
-rw-rw-r--. 1 student student 0  4月 23 16:43 4070C048
-rw-rw-r--. 1 student student 0  4月 23 16:43 4070C049
-rw-rw-r--. 1 student student 0  4月 23 16:43 4070C050

3.2:檔案內容的查詢

3.2.1:連續輸出檔案內容

列出 /etc/hosts 檔案的內容

[student@mail student]$ cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
10.231.8.147 mail.want-want.com

列出 /etc/profile 檔案的內容

[student@mail student]$ cat /etc/profile

承上,第二次列出 /etc/profile 時加上行號輸出

[student@mail student]$ cat -n /etc/profile

讀者僅須列出 /etc/profile 的最前面 10 行

[student@mail student]$ head /etc/profile

讀者僅須列出 /etc/passwd 最後面 10 行的內容

[student@mail student]$ tail /etc/profile

讀者僅須列出 /etc/services 最後 5 行的內容

[student@mail student]$ tail -n 5 /etc/profile

3.2.2:可檢索檔案內容

使用 more /etc/services 一頁一頁翻動資料

[student@mail student]$ more /etc/services
#翻頁按space

承上,請找出 http 這個關鍵字,之後直接離開不再查閱

/http

使用 less /etc/services 查詢檔案內容

[student@mail student]$ less /etc/services

承上,請找出 http 這個關鍵字,之後直接離開不再查閱

/http

3.3:vim 程式編輯器

3.3.1:簡易的 vim 操作

承上,繼續 vim services

請在第 1 行加上『 Welcome to my linux server 』的字樣,輸入完畢後請回到一般指令模式

在一般指令模式底下,跑到第 5 行,按下『 dd 』,看看發生什麼事情?

第5行整行被刪除

回到第 1 行,按下『 p 』又出現什麼資訊?

剛剛被刪除的第5行貼到了下一行

連續按下 5 次『 p 』,然後又按一次『 5p 』又出現什麼?

剛剛被刪除的第5行貼了10行

按下『 u 』會出現什麼狀況?

復原上一步驟

跑到第 1 行,按下『 yy 』然後跑到第 10 行,按下『 p 』,又出現什麼情況?

按yy複製,按p貼上

按下『 G 』(注意大小寫),游標跑到哪裡去?

到最後一行

按下『 gg 』(注意大小寫),游標跑到哪裡去?

到第一行

現在不想要編輯這個檔案了 (因為亂搞一通),不儲存離開時,按下『 :q 』會一直出現僅告尚未存檔的訊息, 你輸入『 :q! 』之後,可以不儲存離開了嘛?

按:q不能離開,因為還有檔案沒有存檔
按:q!可以強制離開

3.3.2:常用的 vim 一般指令模式與指令列模式列表

使用 student 的身份輸入 history ,查閱這次有效的歷史命令有幾個,假設有 50 筆新的指令好了。

history

使用『 history 50 >> ~/history.log 』將指令紀錄到 history.log 檔案中

history 50 >> ~/history.log

使用『 vim ~/history.log 』編輯該檔案,將無效的指令移除,只剩下有需要的檔案,同時在指令後說明該指令的用途。

..好累,簡單講就是考dd刪除整行,跟考i做編輯

課後練習操作

使用 vim 建立一個名為 ~/myname.txt 的檔案,內容填寫你的學號與姓名,並在找出底下的任務後,寫下正確答案

[student@mail ~]$ cd ~
[student@mail ~]$ touch myname.txt

請先實際找出你系統中的 /etc/passwd, /etc/pam.d /etc/rc.local, /dev/vda 這 4 個檔案的『檔案類型 (如一般檔案、目錄檔案等等)』後, 將這 4 個的類型寫入 ~/myname.txt 檔案中。

[student@mail ~]$ file /etc/passwd /etc/pam.d /etc/rc.local /dev/vda >> myname.txt

找出 /usr/lib64 這個目錄內,有個檔名長度為 5 個字元的一般檔案,將該檔案檔名寫入 ~/myname.txt 中。

[student@mail ~]$ ll -d /usr/lib64/????? >> myname.txt

找出 /etc 底下,檔名含有 4 個數字 (數字不一定連接在一起) 的資料,寫下 (1)該檔案的『絕對路徑』檔名,(2)該檔案的類型

touch /etc/1a2b3c4d
ll /etc/*[0-9]*[0-9]*[0-9]*[0-9]*[0-9]*

在 /opt 底下,有個以減號 (-) 為開頭的檔名,該檔案做錯了,因此,請將他刪除 (可能需要 root 的權限)

[student@mail ~]$ su 
密碼:
[root@mail student]# rm /opt/-*

在當前的目錄下,新建 mytest_XX_YY_ZZ.txt ,其中 XX 為『 class1, class2, class3 』,而 YY 為『 week1, week2, week3 』,ZZ 則為『 one, two, three, four 』。

[student@mail ~]$ touch mytest_{class1,class2,class3}_{week1,week2,week3}_{one,two,three,four}.txt

建立一個名為 class1/week2 的目錄,將當前目錄中,含有 class1_week2 的檔名通通『複製』到 class1/week2 目錄下

[student@mail ~]$ mkdir class1/
[student@mail ~]$ mkdir class1/week2
[student@mail ~]$ cp *class1_week2* class1/week2

將檔名含有 class1 檔案,通通『移動』到 class1 目錄下

[student@mail ~]$ cp *class1*.* class1

新建一個名為 one 的目錄,將當前目錄中,所有檔名含有 one 的檔案通通移動到 one 底下

[student@mail ~]$ mkdir one
[student@mail ~]$ cp *one*.* one

建立一個名為 others 的目錄,將當前檔名開頭為 mytest 的檔案,通通移動到該目錄下

[student@mail ~]$ mkdir others
[student@mail ~]$ cp *mytest*.* others

在 student 家目錄下,建立一個 userid 的子目錄,並將工作目錄移動到 userid 內,在 userid 這個目錄內,嘗試以一個指令建立 ksuid001 ksuid002 ... 到 ksuid020 等 20 個『空白目錄』

[student@mail ~]$ mkdir userid
[student@mail ~]$ cd userid
[student@mail userid]$ mkdir ksuid0{01..20}

在 student 家目錄底下,建立一個名為 -myhome 的目錄,並將 student 家目錄中,以 b 為開頭的『隱藏檔』複製到 -myhome 目錄內

mkdir ./-myhome
touch .b1
touch .b2
touch .b3
mv .b* ./-myhome

將工作目錄移動到 -myhome 目錄內,並將 /etc/sysconfig 目錄複製到當前目錄下 (會有一些錯誤訊息是正確的!)

[student@mail ~]$ mkdir ./-myhome
[student@mail ~]$ cd ./-myhome
[student@mail -myhome]$ cp -r /etc/sysconfig .
cp: 無法開啟 ‘/etc/sysconfig/ip6tables-config’ 來讀取資料: 拒絕不符權限的操作
cp: 無法開啟 ‘/etc/sysconfig/iptables-config’ 來讀取資料: 拒絕不符權限的操作
cp: 無法開啟 ‘/etc/sysconfig/crond’ 來讀取資料: 拒絕不符權限的操作
cp: 無法開啟 ‘/etc/sysconfig/ebtables-config’ 來讀取資料: 拒絕不符權限的操作
cp: 無法開啟 ‘/etc/sysconfig/sshd’ 來讀取資料: 拒絕不符權限的操作

將當前目錄下的 sysconfig/cbq 目錄刪除

[student@mail -myhome]$ rm -rf sysconfig/cbq

列出 /etc/profile 與 /etc/services 的最後 5 行,並將這 10 行轉存到當前目錄下的 myetc.txt 檔案中

[student@mail -myhome]$ tail -n 5 /etc/profile >> myetc.txt
[student@mail -myhome]$ tail -n 5 /etc/services >> myetc.txt

將 myetc.txt 複製成為 myetc2.txt,並使用 vim 編輯 myetc2.txt ,第一行加入『 I can use vim 』的字樣即可。

[student@mail -myhome]$ cp myetc.txt myetc2.txt
[student@mail -myhome]$ vim myetc2.txt
#按 i
#輸入 I can use vim
#按 ESC
#按 :
#輸入 wq!

在 student 家目錄下,有個名為 mytext.txt 的檔案,請使用 vim 開啟該檔案,並將第一行複製後,貼上 100 次,之後『強制儲存』即可離開 vim 。

[student@mail -myhome]$ vim mytext.txt
#按gg
#按yy
#按100p
#按 :
#輸入 wq!

results matching ""

    No results matching ""