1. 程式人生 > >Linux的檔案和目錄管理

Linux的檔案和目錄管理

1 檢視檔案與目錄:ls

[[email protected] ~]# ls [-aAdfFhilnrRSt] 目錄名稱
[[email protected] ~]# ls [--color={never,auto,always}] 目錄名稱
[[email protected] ~]# ls [--full-time] 目錄名稱
選項與引數:
-a  :全部的檔案,連同隱藏檔( 開頭為 . 的檔案) 一起列出來(常用)
-A  :全部的檔案,連同隱藏檔,但不包括 . 與 .. 這兩個目錄
-d  :僅列出目錄本身,而不是列出目錄內的檔案資料(常用)
-f  :直接列出結果,而不進行排序 (ls 預設會以檔名排序!)
-F  :根據檔案、目錄等資訊,給予附加資料結構,例如:
      *:代表可執行檔; /:代表目錄; =:代表 socket 檔案; |:代表 FIFO 檔案;
-h  :將檔案容量以人類較易讀的方式(例如 GB, KB 等等)列出來;
-i  :列出 inode 號碼,inode 的意義下一章將會介紹;
-l  :長資料串列出,包含檔案的屬性與許可權等等資料;(常用)
-n :列出 UID 與 GID 而非使用者與群組的名稱 (UID與GID會在帳號管理提到!) -r :將排序結果反向輸出,例如:原本檔名由小到大,反向則為由大到小; -R :連同子目錄內容一起列出來,等於該目錄下的所有檔案都會顯示出來; -S :以檔案容量大小排序,而不是用檔名排序; -t :依時間排序,而不是用檔名。 --color=never :不要依據檔案特性給予顏色顯示; --color=always :顯示顏色 --color=auto :讓系統自行依據配置來判斷是否給予顏色 --full-time :以完整時間模式 (包含年、月、日、時、分) 輸出 --time={atime,ctime} :輸出 access 時間或改變許可權屬性時間 (ctime) 而非內容變更時間 (modification time) Example:
範例一:將家目錄下的所有檔案列出來(含屬性與隱藏檔)
[[email protected] ~]# ls -al ~
total 156
drwxr-x---  4 root root  4096 Sep 24 00:07 .
drwxr-xr-x 23 root root  4096 Sep 22 12:09 ..
-rw-------  1 root root  1474 Sep  4 18:27 anaconda-ks.cfg
-rw-------  1 root root   955 Sep 24 00:08 .bash_history
-rw-r--r--  1 root root    24 Jan  6  2007 .bash_logout
-rw-r--r--  1 root root   191 Jan  6  2007 .bash_profile
-rw-r--r--  1 root root   176 Jan  6  2007 .bashrc
drwx------  3 root root  4096 Sep  5 10:37 .gconf
-rw-r--r-- 1 root root 42304 Sep 4 18:26 install.log -rw-r--r-- 1 root root 5661 Sep 4 18:25 install.log.syslog # 這個時候你會看到以 . 為開頭的幾個檔案,以及目錄檔 (.) (..) .gconf 等等, # 不過,目錄檔檔名都是以深藍色顯示,有點不容易看清楚就是了。

2 複製檔案和目錄cp

-d 複製時保留原連結
-p 保留原始檔或目錄的屬性,包括所有者、所屬組、許可權與時間等等
-R 遞迴處理,將目錄下的檔案及子目錄一併處理
-a 相當於dpR的組合,將mode,group owner(若有許可權)都複製過來

-f 強行復制檔案或目錄, 不論目的檔案或目錄是否已經存在
-i 覆蓋檔案之前先詢問使用者,互動式複製
-l 進行硬連結(hard link),而非複製檔案
-s 複製成為符號連結檔案(symbolic link),也就是建立“快捷方式”

example

範例一:用root身份,將家目錄下的 .bashrc 複製到 /tmp 下,並更名為 bashrc
[[email protected] ~]# cp ~/.bashrc /tmp/bashrc
[[email protected] ~]# cp -i ~/.bashrc /tmp/bashrc
cp: overwrite `/tmp/bashrc'? n  <==n不覆蓋,y為覆蓋
# 重複作兩次動作,由於 /tmp 底下已經存在 bashrc 了,加上 -i 選項後,
# 則在覆蓋前會詢問使用者是否確定!可以按下 n 或者 y 來二次確認呢!

範例二:變換目錄到/tmp,並將/var/log/wtmp複製到/tmp且觀察屬性:
[[email protected] ~]# cd /tmp
[[email protected] tmp]# cp /var/log/wtmp . <==想要複製到目前的目錄,最後的 . 不要忘
[[email protected] tmp]# ls -l /var/log/wtmp wtmp
-rw-rw-r-- 1 root utmp 96384 Sep 24 11:54 /var/log/wtmp
-rw-r--r-- 1 root root 96384 Sep 24 14:06 wtmp
# 注意上面的特殊字型,在不加任何選項的情況下,檔案的某些屬性/許可權會改變;
# 這是個很重要的特性!要注意喔!還有,連檔案建立的時間也不一樣了!
# 那如果你想要將檔案的所有特性都一起復制過來該怎辦?可以加上 -a 喔!如下所示:

[[email protected] tmp]# cp -a /var/log/wtmp wtmp_2
[[email protected] tmp]# ls -l /var/log/wtmp wtmp_2
-rw-rw-r-- 1 root utmp 96384 Sep 24 11:54 /var/log/wtmp
-rw-rw-r-- 1 root utmp 96384 Sep 24 11:54 wtmp_2
# 了了吧!整個資料特性完全一模一樣ㄟ!真是不賴~這就是 -a 的特性!

範例三:複製 /etc/ 這個目錄下的所有內容到 /tmp 底下
[[email protected] tmp]# cp /etc/ /tmp
cp: omitting directory `/etc'   <== 如果是目錄則不能直接複製,要加上 -r 的選項
[[email protected] tmp]# cp -r /etc/ /tmp
# 還是要再次的強調喔! -r 是可以複製目錄,但是,檔案與目錄的許可權可能會被改變
# 所以,也可以利用『 cp -a /etc /tmp 』來下達命令喔!尤其是在備份的情況下!

範例四:將範例一複製的 bashrc 建立一個連結檔 (symbolic link)
[[email protected] tmp]# ls -l bashrc
-rw-r--r-- 1 root root 176 Sep 24 14:02 bashrc  <==先觀察一下檔案情況
[[email protected] tmp]# cp -s bashrc bashrc_slink
[[email protected] tmp]# cp -l bashrc bashrc_hlink
[[email protected] tmp]# ls -l bashrc*
-rw-r--r-- 2 root root 176 Sep 24 14:02 bashrc  <==與原始檔案不太一樣了!
-rw-r--r-- 2 root root 176 Sep 24 14:02 bashrc_hlink
lrwxrwxrwx 1 root root   6 Sep 24 14:20 bashrc_slink -> bashrc

範例五:若 ~/.bashrc 比 /tmp/bashrc 新才複製過來
[[email protected] tmp]# cp -u ~/.bashrc /tmp/bashrc
# 這個 -u 的特性,是在目標檔案與來原始檔有差異時,才會複製的。
# 所以,比較常被用於『備份』的工作當中喔! ^_^

範例六:將範例四造成的 bashrc_slink 複製成為 bashrc_slink_1 與bashrc_slink_2
[[email protected] tmp]# cp bashrc_slink bashrc_slink_1
[[email protected] tmp]# cp -d bashrc_slink bashrc_slink_2
[[email protected] tmp]# ls -l bashrc bashrc_slink*
-rw-r--r-- 2 root root 176 Sep 24 14:02 bashrc
lrwxrwxrwx 1 root root   6 Sep 24 14:20 bashrc_slink -> bashrc
-rw-r--r-- 1 root root 176 Sep 24 14:32 bashrc_slink_1       <==與原始檔案相同
lrwxrwxrwx 1 root root   6 Sep 24 14:33 bashrc_slink_2 -> bashrc <==是連結檔!
# 這個例子也是很有趣喔!原本複製的是連結檔,但是卻將連結檔的實際檔案複製過來了
# 也就是說,如果沒有加上任何選項時,cp複製的是原始檔案,而非連結檔的屬性!
# 若要複製連結檔的屬性,就得要使用 -d 的選項了!如 bashrc_slink_2 所示。

範例七:將家目錄的 .bashrc 及 .bash_history 複製到 /tmp 底下
[[email protected] tmp]# cp ~/.bashrc ~/.bash_history /tmp
# 可以將多個數據一次複製到同一個目錄去!最後面一定是目錄!

3 刪除檔案或目錄rm

-i 刪除前逐一詢問確認
-f 直接刪除,無需逐一確認
-r 將目錄以及子目錄均遞迴地刪除(常常使用在刪除目錄的時候)
example

範例一:將剛剛在 cp 的範例中建立的 bashrc 刪除掉!
[[email protected] ~]# cd /tmp
[[email protected] tmp]# rm -i bashrc
rm: remove regular file `bashrc'? y
# 如果加上 -i 的選項就會主動詢問喔,避免你刪除到錯誤的檔名!

範例二:透過萬用位元組*的幫忙,將/tmp底下開頭為bashrc的檔名通通刪除:
[[email protected] tmp]# rm -i bashrc*
# 注意那個星號,代表的是 0 到無窮多個任意位元組喔!很好用的東西!

範例三:將 cp 範例中所建立的 /tmp/etc/ 這個目錄刪除掉!
[[email protected] tmp]# rmdir /tmp/etc
rmdir: etc: Directory not empty  <== 刪不掉啊!因為這不是空的目錄!
[[email protected] tmp]# rm -r /tmp/etc
rm: descend into directory `/tmp/etc'? y
....(中間省略)....
# 因為身份是 root ,預設已經加入了 -i 的選項,所以你要一直按 y 才會刪除!
# 如果不想要繼續按 y ,可以按下『 [ctrl]-c 』來結束 rm 的工作。
# 這是一種保護的動作,如果確定要刪除掉此目錄而不要詢問,可以這樣做:
[[email protected] tmp]# \rm -r /tmp/etc
# 在命令前加上反斜線,可以忽略掉 alias 的指定選項喔!至於 alias 我們在bash再談!

範例四:刪除一個帶有 - 開頭的檔案
[[email protected] tmp]# touch ./-aaa-  <==touch這個命令可以建立空檔案!
[[email protected] tmp]# ls -l 
-rw-r--r-- 1 root  root      0 Sep 24 15:03 -aaa-  <==檔案大小為0,所以是空檔案
[[email protected] tmp]# rm -aaa-
Try `rm --help' for more information.  <== 因為 "-" 是選項嘛!所以系統誤判了!
[[email protected] tmp]# rm ./-aaa-

4移動或者重新命名檔案

-i 互動方式操作。如果mv操作將導致對已存在的目標檔案的覆蓋,此時系統詢問是否重寫,要求使用者回答y或n,這樣可以避免誤覆蓋檔案
-f 禁止互動操作。在mv操作要覆蓋某已有的目標檔案時不給任何提示
-u 如果目標檔案已經存在,且原始檔比較新的話,才會進行更新。相當於update

example

範例一:複製一檔案,建立一目錄,將檔案移動到目錄中
[[email protected] ~]# cd /tmp
[[email protected] tmp]# cp ~/.bashrc bashrc
[[email protected] tmp]# mkdir mvtest
[[email protected] tmp]# mv bashrc mvtest
# 將某個檔案移動到某個目錄去,就是這樣做!

範例二:將剛剛的目錄名稱更名為 mvtest2
[[email protected] tmp]# mv mvtest mvtest2 <== 這樣就更名了!簡單~(因為mvtest2不存在)
# 其實在 Linux 底下還有個有趣的命令,名稱為 rename ,
# 該命令專職進行多個檔名的同時更名,並非針對單一檔名變更,與mv不同。請man rename。

範例三:再建立兩個檔案,再全部移動到 /tmp/mvtest2 當中
[[email protected] tmp]# cp ~/.bashrc bashrc1
[[email protected] tmp]# cp ~/.bashrc bashrc2
[[email protected] tmp]# mv bashrc1 bashrc2 mvtest2
# 注意到這邊,如果有多個來原始檔或目錄,則最後一個目標檔一定是『目錄!』
# 意思是說,將所有的資料移動到該目錄的意思!

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

[[email protected] ~]# basename /etc/sysconfig/network
network         <== 很簡單!就取得最後的檔名~
[[email protected] ~]# dirname /etc/sysconfig/network
/etc/sysconfig  <== 取得的變成目錄名了!

來源:http://cjjwzs.iteye.com/blog/1035763      http://vbird.dic.ksu.edu.tw/linux_basic/0220filemanager.php#ls