1. 程式人生 > >第七章 檔案與目錄管理

第七章 檔案與目錄管理

檔案與目錄管理:

談了談目錄與路徑之後,再來討論一下關於檔案的一些基本管理吧!檔案與目錄的管理上,不外乎『顯示屬性』、 『拷貝』、『刪除檔案』及『移動檔案或目錄』等等,由於檔案與目錄的管理在 Linux 當中是很重要的, 尤其是每個人自己家目錄的資料也都需要注意管理!所以我們來談一談有關檔案與目錄的一些基礎管理部分吧!

檔案與目錄的檢視: ls

8d521e6e-5b73-3066-abde-2a984685fc13.png

在Linux系統當中,這個 ls 命令可能是最常被執行的吧!因為我們隨時都要知道檔案或者是目錄的相關資訊啊~ 不過,我們Linux的檔案所記錄的資訊實在是太多了,ls 沒有需要全部都列出來呢~ 所以,當你只有下達 ls 時,預設顯示的只有:非隱藏檔的檔名、 以檔名進行排序及檔名代表的顏色顯示如此而已。舉例來說, 你下達『 ls /etc 』之後,只有經過排序的檔名以及以藍色顯示目錄及白色顯示一般檔案,如此而已。

那如果我還想要加入其他的顯示資訊時,可以加入上頭提到的那些有用的選項呢~ 舉例來說,我們之前一直用到的 -l 這個長串顯示資料內容,以及將隱藏檔也一起列示出來的 -a 選項等等。

其實 ls 的用法還有很多,包括查閱檔案所在 i-node 號碼的 ls -i 選項,以及用來進行檔案排序的 -S 選項,還有用來查閱不同時間的動作的 --time=atime 等選項(更多時間說明請參考本章後面touch的說明)。而這些選項的存在都是因為 Linux 檔案系統記錄了很多有用的資訊的緣故。那麼 Linux 的檔案系統中,這些與許可權、屬性有關的資料放在哪裡呢? 放在 i-node 裡面。關於這部分,我們會在下一章繼續為你作比較深入的介紹啊!

無論如何, ls 最常被使用到的功能還是那個 -l 的選項
,為此,很多 distribution 在預設的情況中, 已經將 ll (L 的小寫) 配置成為 ls -l 的意思了!其實,那個功能是 Bash shell 的 alias 功能呢~也就是說,我們直接輸入 ll 就等於是輸入 ls -l 是一樣的~關於這部分,我們會在後續 bash shell 時再次的強調滴~

複製、刪除與移動: cp, rm, mv

要複製檔案,請使用 cp (copy) 這個命令即可~不過, cp 這個命令的用途可多了~ 除了單純的複製之外,還可以建立連結檔 (就是捷徑羅),比對兩檔案的新舊而予以升級, 以及複製整個目錄等等的功能呢!至於移動目錄與檔案,則使用 mv (move), 這個命令也可以直接拿來作更名 (rename) 的動作喔!
至於移除嗎?那就是 rm (remove) 這個命令羅~底下我們就來瞧一瞧先~

cp (複製檔案或目錄)

a6ee4bec-2f4c-3bb8-b941-8a38d475fc99.png

複製(cp)這個命令是非常重要的,不同身份者執行這個命令會有不同的結果產生,尤其是那個-a, -p的選項, 對於不同身份來說,差異則非常的大!底下的練習中,有的身份為root有的身份為一般帳號(在我這裡用vbird這個帳號), 練習時請特別注意身份的差別喔!好!開始來做複製的練習與觀察:

057ba602-a6e2-3a3c-a71d-d77efa2daf5e.png

這個 cp 的功能很多,由於我們常常會進行一些資料的複製,所以也會常常用到這個命令的。 一般來說,我們如果去複製別人的資料 (當然,該檔案你必須要有 read 的許可權才行啊! ^_^) 時, 總是希望複製到的資料最後是我們自己的,所以,在預設的條件中, cp 的來源檔與目的檔的許可權是不同的,目的檔的擁有者通常會是命令操作者本身。舉例來說, 上面的範例二中,由於我是 root 的身份,因此複製過來的檔案擁有者與群組就改變成為 root 所有了! 這樣說,可以明白嗎?^_^

由於具有這個特性,因此當我們在進行備份的時候,某些需要特別注意的特殊許可權檔案, 例如密碼檔 (/etc/shadow) 以及一些配置檔,就不能直接以 cp 來複制,而必須要加上 -a 或者是 -p 等等可以完整複製檔案許可權的選項才行!
另外,如果你想要複製檔案給其他的使用者, 也必須要注意到檔案的許可權(包含讀、寫、執行以及檔案擁有者等等), 否則,其他人還是無法針對你給予的檔案進行修訂的動作喔!注意注意!

c6eb40c3-333d-3b25-b43b-9ce9848a2c64.png

範例四可有趣了!使用 -l 及 -s 都會建立所謂的連結檔(link file),但是這兩種連結檔卻有不一樣的情況。這是怎麼一回事啊? 那個 -l 就是所謂的實體連結(hard link),至於 -s 則是符號連結(symbolic link), 簡單來說,bashrc_slink 是一個『捷徑』,這個捷徑會連結到bashrc去!所以你會看到檔名右側會有個指向(->)的符號!

至於bashrc_hlink檔案與bashrc的屬性與許可權完全一模一樣,與尚未進行連結前的差異則是第二欄的link數由1變成2了! 鳥哥這裡先不介紹實體連結,因為實體連結涉及 i-node 的相關知識,我們下一章談到檔案系統(filesystem)時再來討論這個問題。

例題:
你能否使用vbird的身份,完整的複製/var/log/wtmp檔案到/tmp底下,並更名為vbird_wtmp呢?
答:
實際做看看的結果如下:
[[email protected] ~]$ cp -a /var/log/wtmp /tmp/vbird_wtmp
[[email protected] ~]$ ls -l /var/log/wtmp /tmp/vbird_wtmp
-rw-rw-r-- 1 vbird vbird 96384  9月 24 11:54 /tmp/vbird_wtmp
-rw-rw-r-- 1 root  utmp  96384  9月 24 11:54 /var/log/wtmp
由於vbird的身份並不能隨意修改檔案的擁有者與群組,因此雖然能夠複製wtmp的相關許可權與時間等屬性, 但是與擁有者、群組相關的,原本vbird身份無法進行的動作,即使加上 -a 選項,也是無法達成完整複製許可權的!


總之,由於 cp 有種種的檔案屬性與許可權的特性,所以,在複製時,你必須要清楚的瞭解到:

是否需要完整的保留來原始檔的資訊?
來原始檔是否為連結檔 (symbolic link file)?
來源檔是否為特殊的檔案,例如 FIFO, socket 等?
來源檔是否為目錄?

rm (移除檔案或目錄)

220c8578-aaed-3588-a9ee-9b85bda9f8bc.png

這是移除的命令(remove),要注意的是,通常在Linux系統下,為了怕檔案被誤殺,所以很多 distributions 都已經預設加入 -i 這個選項了!而如果要連目錄下的東西都一起殺掉的話, 例如子目錄裡面還有子目錄時,那就要使用 -r 這個選項了!不過,使用『 rm -r 』這個命令之前,請千萬注意了,因為該目錄或檔案『肯定』會被 root 殺掉!因為系統不會再次詢問你是否要砍掉呦!所以那是個超級嚴重的命令下達呦! 得特別注意!不過,如果你確定該目錄不要了,那麼使用 rm -r 來迴圈殺掉是不錯的方式!

另外,範例四也是很有趣的例子,我們在之前就談過,檔名最好不要使用 "-" 號開頭, 因為 "-" 後面接的是選項,因此,單純的使用『 rm -aaa- 』系統的命令就會誤判啦! 那如果使用後面會談到的正規表示法時,還是會出問題的!所以,只能用避過首位位元組是 "-" 的方法啦! 就是加上本目錄『 ./ 』即可!如果 man rm 的話,其實還有一種方法,那就是『 rm -- -aaa- 』也可以啊!

mv (移動檔案與目錄,或更名)

0f091f7c-7078-31bd-bdf1-7852b6ecbccf.png

這是搬移 (move) 的意思!當你要移動檔案或目錄的時後,呵呵!這個命令就很重要啦! 同樣的,你也可以使用 -u ( update )來測試新舊檔案,看看是否需要搬移羅! 另外一個用途就是『變更檔名!』,我們可以很輕易的使用 mv 來變更一個檔案的檔名呢!不過,在 Linux 才有的命令當中,有個 rename , 可以用來更改大量檔案的檔名,你可以利用 man rename 來查閱一下,也是挺有趣的命令喔!


取得路徑的檔名稱與目錄名稱


我們前面介紹的完整檔名 (包含目錄名稱與檔名稱) 當中提到,完整檔名最長可以到達 4096 個位元組。 那麼你怎麼知道那個是檔名?那個是目錄名?嘿嘿!就是利用斜線 (/) 來分辨啊! 其實,取得檔名或者是目錄名稱,一般的用途應該是在寫程式的時候,用來判斷之用的啦~ 所以,這部分的命令可以用在第三篇內的 shell scripts 裡頭喔! 底下我們簡單的以幾個範例來談一談 basename 與 dirname 的用途!

  • 8d521e6e-5b73-3066-abde-2a984685fc13-thumb.png
  • 大小: 21.7 KB
  • a6ee4bec-2f4c-3bb8-b941-8a38d475fc99-thumb.png
  • 大小: 13.4 KB
  • 057ba602-a6e2-3a3c-a71d-d77efa2daf5e-thumb.png
  • 大小: 18.8 KB
  • c6eb40c3-333d-3b25-b43b-9ce9848a2c64-thumb.png
  • 大小: 13 KB
  • 220c8578-aaed-3588-a9ee-9b85bda9f8bc-thumb.png
  • 大小: 16.2 KB
  • 0f091f7c-7078-31bd-bdf1-7852b6ecbccf-thumb.png
  • 大小: 18.5 KB
  • 2a8e7a1c-8b9d-30f4-a30b-8a6dd4a0ff87-thumb.png
  • 大小: 3.6 KB