跳轉到內容

Unix/命令/檔案系統實用程式指南

來自華夏公益教科書
ls
列出目錄的內容

ls 是一個用於列出目錄中的檔案的實用程式。

最常用的選項是

-a
所有檔案(包括以 . 開頭的檔案)
-l
長詳細資訊(提供檔案統計資訊)
-t
按建立時間排序
-u
按訪問時間排序(或與 -l 一起顯示上次訪問時間)
-S
按大小排序
-r
反轉順序
-F
用 / 標記目錄,用 * 標記可執行檔案,用 @ 標記符號連結,用 = 標記本地套接字,用 | 標記命名管道 (FIFO)


其他選項包括

-Fx --color
彩色編碼列表
-s
顯示檔案大小
-Z
顯示檔案/目錄及其 SELinux 上下文(僅在 SELinux 啟用樹上)
-h
"人類可讀";以 KB 和 MB 為單位顯示檔案大小(-h 可以與 -l 或 -s 一起使用)
ls *st* : list files that contain st in name
ls > list : output list to file named "list"
ls | more : fit listing to screen

例子

$ ls
fish  hello.txt
$ ls -l
-rw-r--r--    1 username    groupname        0 Apr 11 00:09 fish
-rw-r--r--    1 username    groupname       11 Apr 11 00:10 hello.txt

幾個系統都有一個別名 ll,它與 ls -l 相同

$ ll
-rw-r--r--    1 username    groupname        0 Apr 11 00:09 fish
-rw-r--r--    1 username    groupname       11 Apr 11 00:10 hello.txt

小心使用 -F 選項。這裡有一個例子

$ ls -F /usr/X11R6/bin/X*
/usr/X11R6/bin/X@          /usr/X11R6/bin/Xnest*      /usr/X11R6/bin/Xprt*
/usr/X11R6/bin/Xmark*      /usr/X11R6/bin/Xorg*       /usr/X11R6/bin/Xvfb*

我們還不知道是否存在一個名為 "X" 的符號連結和一個名為 "Xmark" 的可執行檔案,或者 "X@" 和 "Xmark*" 僅僅是普通檔案的名字。(儘管 "@" 和 "*" 在檔名中並不常見,但它們是可能的。)因此,我們透過刪除 -F 來檢查

$ ls /usr/X11R6/bin/X*
/usr/X11R6/bin/X           /usr/X11R6/bin/Xnest       /usr/X11R6/bin/Xprt
/usr/X11R6/bin/Xmark       /usr/X11R6/bin/Xorg        /usr/X11R6/bin/Xvfb

連結

  • ls,opengroup.org

mkdir 是一個用於建立目錄的實用程式。

例子

$ mkdir newdirectoryname

-p 選項還會根據需要建立父目錄。而不是

$ mkdir foo
$ cd foo
$ mkdir bar

你只需執行

$ mkdir -p foo/bar

連結

cd
更改當前目錄

cd 更改 shell 的當前目錄。此當前目錄將被 shell 啟動的其他程式使用。

由於 "cd" 更改了 shell 的狀態,它是一個shell 內建命令。相反,大多數命令是 shell 啟動的單獨程式。

例子

更改到 'foobar' 目錄

$ cd foobar

更改到您的主目錄,不帶選項的 cd 命令會將您帶回您的主目錄。

$ cd

~ (波浪號) 儲存您主目錄的路徑,此命令與上一個命令具有相同的效果。

$ cd ~

在後面加上使用者名稱,該命令會更改到該特定使用者的家目錄。

$ pwd
/
$ cd ~user
$ pwd
/home/user

更改到父目錄

$ cd ..

更改到上一個目錄

$ cd -

提示

透過在您的 shell 中設定 "CDPATH" 環境變數,您可以利用 shell 命令完成功能。

$ echo $CDPATH
.:/usr/local:/usr/share/doc

如果您設定了 $CDPATH,那麼您按下 'TAB' 鍵並將獲得可能的路徑完成

$ cd bas [TAB]
base-config/  base-files/   base-passwd/  bash/         bastille/
pwd
列印工作目錄

pwd(列印工作目錄)顯示您所在的當前目錄。

雖然 "pwd" 通常作為外部程式提供(如/bin/pwd),但許多 shell 提供等效版本作為 shell 內建命令。與任何外部命令一樣,"pwd" 會從啟動它的 shell 或其他程式繼承當前目錄。

例子

$ pwd
/home/username

您可以更改目錄,也可以

$ cd /usr
$ pwd
/usr

您也可以在指令碼中使用 "pwd"。如果您對指令碼有足夠的經驗,那麼您就會知道下一行會抱怨當前目錄是/home/username.

$ test "x$(pwd)" = x/home/username || echo wrong directory
chroot
更改根目錄

chroot 更改根檔案系統。 "chroot" 頁面 在 Linux 問題維基中解釋了您可能想要執行此操作的原因。

例子

要更改根檔案系統,以便/mnt/usbdrive/成為/並且無法看到它之外的檔案

# chroot /mnt/usbdrive/

您必須是 root 使用者才能 "chroot"。其他使用者將能夠使用 "chroot" 獲取 root(超級使用者)許可權,因此禁止他們使用 "chroot"。

$ chroot /mnt/usbdrive/
chroot: /mnt/usbdrive/: Operation not permitted

cp 複製檔案

最常用的選項是

-r
複製目錄(遞迴)
-p
保留許可權、所有權和時間戳
-i
在覆蓋之前提示
-v
詳細,顯示正在複製的檔名

例子

Makes a copy of file 'debian' and call it 'Debian' (assuming 'Debian' is not already a directory)
$ cp -i debian Debian
Makes a copy of file 'debian' and put it at /tmp/debian
$ cp -i debian /tmp/debian 
Same as the previous command (the filename defaults to be the same).
$ cp -i debian /tmp 
Makes a copy of directory 'mydir' (and all its contents) and put it at /tmp/mydir
$ cp -ir mydir/ /tmp 
Copy multiple files to directory /tmp
$ cp -i foo bar baz /tmp 

連結

mv 移動和/或重新命名檔案

例子

Rename file 'unix' to 'Unix' (assuming "Unix" is not a directory)
$ mv -i unix Unix
Move file Unix from your home directory to /tmp.
$ mv -i ~/Unix /tmp/Unix
Same as the previous command (the filename defaults to be the same).
$ mv -i ~/Unix /tmp
Move file Unix from your home directory to /tmp, and rename it to 'unix'.
$ mv -i ~/Unix /tmp/unix
Move multiple files to directory /tmp
$ mv -i foo bar baz /tmp

連結

  • mv, opengroup.org
  • mv 手冊頁, man.cat-v.org
  • mv 在 GNU Coreutils 手冊中,gnu.org
rm
刪除檔案

rm 從檔案系統中刪除檔案,類似於 DOS 中的“del”命令。

GNU 長選項(如--directory) 在 Linux 上可用,但在大多數其他系統上不可用。

一些有用的選項是

-d, --directory
刪除 FILE,即使它是一個空目錄(某些系統允許超級使用者刪除非空目錄)
-f, --force
忽略不存在的檔案,從不提示
-i, --interactive
在任何刪除之前提示
-P
(*BSD 僅限) 在刪除之前覆蓋檔案
-r, -R, --recursive
遞迴刪除目錄的內容(通常必須使用 force 選項才能成功執行 rm 遞迴)
-v, --verbose
(僅限 GNU) 解釋正在執行的操作
--help
(僅限 GNU) 顯示幫助並退出
--version
(僅限 GNU) 輸出版本資訊並退出

例子

“rm”的使用被認為比其他作業系統中的等效命令更危險,因為 shell 解析萬用字元和特殊目錄名稱的方式以及它的非詳細操作。

這是一個經典的例子。與其刪除以.o結尾的檔案(“*.o”),它刪除目錄中的所有檔案(“*”),還刪除一個名為.o. 的檔案。在星號和句號之間有一個不需要的空格。

$ rm * .o
rm: cannot remove `.o': No such file or directory

要刪除一個名稱以 `-` 開頭的檔案,例如 `-foo`,請使用以下命令之一

$ rm -- -foo
$ rm ./-foo

建立一個名為“remove”的別名可能很有用,它將檔案移動到一個本地“trash”檔案中,這樣您就可以去那裡恢復意外“remove”的檔案。

安全刪除檔案

請注意,如果您使用 rm 刪除檔案,通常可以恢復該檔案的內容,因為rm不會從硬碟中刪除它。它只是刪除檔案系統到它的連結。

在 *BSD 系統上,-P 選項在刪除檔案之前用該檔案覆蓋資料。

$ rm -P secretfile

但是,正如 NetBSD 手冊頁 解釋的那樣

最近的研究表明,可能需要使用精心選擇的資料模式進行 35 次覆蓋才能真正防止從磁性磁碟中恢復資料。因此,-P 選項很可能既不滿足其設計目的,對於預設操作來說成本又太高。

因此,雖然檢查資料(使用 fsdb 或製作磁碟映像)不會顯示秘密資料,但其他方法(例如實驗室檢查磁碟)會顯示資料。簡而言之,rm -P 不會安全地刪除資料。試圖安全刪除資料的程式是 GNU shred,它在 Linux 上可用。但“shred”並不總是能夠成功地安全刪除資料;請閱讀下面關於它的條目。

rmdir

[edit | edit source]

rmdir 是一個用於刪除空目錄的實用程式。

例子

$ rmdir directoryname

如果目錄不為空,則以遞迴方式刪除目錄及其所有內容的正確方法是使用

$ rm -r directoryname

連結

shred

[edit | edit source]
shred
嘗試安全刪除檔案

shred 用特殊資料模式多次覆蓋檔案,使檔案中的舊內容無法從磁碟(尤其是硬碟)中恢復。此命令是 GNU coreutils 的一部分,因此它通常只在 Linux 系統上可用。

請注意,這實際上對大多數檔案系統無效,因為它們可以保留資料的舊副本。大多數流行的 Linux 檔案系統(包括 ext3)透過日誌記錄保留此類副本。但是,“shred”對於銷燬整個分割槽或磁碟上的資料非常有用。

一些有用的選項是

-u, --remove
刪除檔案後將其取消連結
-NUMBER, -n NUMBER, --iterations=NUMBER
覆蓋檔案的迭代次數;預設值為 25 次迭代

示例: 刪除並完全銷燬secretfile來自一個就地覆蓋資料且不使用日誌記錄的檔案系統(例如,*BSD 的 UFS 檔案系統)。在最後一步,在資料被銷燬後,“-u”選項將檔案從檔案系統中取消連結。

$ shred -u secretfile

請注意,如果secretfile具有多個硬連結(例如使用 ln),它將繼續使用這些其他名稱存在,但只包含隨機資料。

touch

[edit | edit source]

touch 允許您更改檔案的日期。也可以用來建立一個空檔案。

例子

這將把filename 的訪問日期和時間更改為當前時間。如果filename 不存在,它將建立一個空檔案。

$ touch filename

連結

df 報告每個分割槽上可用的可用磁碟空間量。

$ df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/md0               5763508    207380   5263352   4% /
/dev/md1              78819376  13722288  61093296  19% /home
/dev/md4              23070564   4309572  17589056  20% /usr
/dev/md2               5763508   1757404   3713328  33% /var
/dev/md3               2877756    334740   2396832  13% /tmp


以人類可讀的格式報告磁碟使用情況,塊大小為千位元組、兆位元組、千兆位元組。

$ df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/hda1             2.3G  2.1G  133M  95% /
tmpfs                  61M  8.0K   61M   1% /dev/shm
/dev/hda2             2.0G  1.8G  113M  94% /usr

連結

顯示磁碟使用情況。

連結

ln 建立檔案之間的連結。

符號連結是包含指向獨立檔案的絕對或相對路徑的特殊檔案。指向符號連結的引用將“轉發”到它(符號連結)指向的檔案。被轉發引用的檔案“不知道”連結;如果指向的檔案被移動或刪除,連結將只指向空值(不會發出警告,也不會嘗試將連結“重新整理”到檔案的新位置)。

在 Unix 中,關於檔案的所有資訊 - 所有者、組、許可權、大小、連結數量、磁碟上的位置 - 都儲存在 inode 中(檔名 除外)。檔名儲存在目錄中,在那裡 inode 編號(作業系統引用檔案的方式)與檔名(文字字串;使用者引用檔案的方式)配對。“連結數量”條目在 inode 中,跟蹤 inode 編號在某個目錄中與名稱配對的次數。

使用ln,"原始檔"僅用於確定 inode 號。然後,使用該 inode 號在某個目錄中建立新的 inode 號到檔名的條目,並增加 "連結數"計數器。重要的是,這(與符號連結不同)是同一個檔案,在各個方面都相同……只是該檔案可以透過不同的名稱和/或從不同的位置訪問。移動或刪除 "原始" 原始檔不會影響其他連結。刪除檔案的某個連結只會從目錄中刪除其條目……只有當任何目錄中的最後一個連結被刪除時,檔案才會真正從磁碟中刪除。

硬連結不能(與符號連結不同)用於引用另一個檔案系統上的檔案,硬連結通常也不能用於連結到目錄。

例子

要建立一個指向檔案 "/home/alice/code/bin/world" 的軟(符號)連結 "hello"

$ ln -s /home/alice/code/bin/world hello

要建立一個從檔案 "foo" 到檔案 "bar" 的(硬)連結

$ ls -l
total 1
-rw-r--r--  1  rtm  users  50  Aug 15   foo
$ ln foo bar
$ ls -l
total 2
-rw-r--r--  2  rtm  users  50  Aug 15   foo
-rw-r--r--  2  rtm  users  50  Aug 15   bar

第一個數字ls -l的列表顯示了檔案擁有的(硬)連結數,換句話說,就是檔案在某個目錄中被記錄的次數。

連結

chown
更改檔案的擁有者

chown 更改檔案的所有者和組。通常,只有 root 使用者可以執行此操作,但如果使用者擁有某個檔案,則該使用者可以更改組,但只能更改包含該使用者的組。在舊系統中,使用者將檔案贈送給其他使用者的功能會導致濫用,因此大多數系統禁止非 root 使用者更改檔案的所有者。

一些有用的選項是

-R
遞迴地更改整個目錄樹的所有者/組
-h
不遵循符號連結,即更改連結的所有者,而不是目標檔案
-f
如果更改失敗,則指示沒有錯誤

例子

Root 將 "/etc/passwd" 和 "/etc/shadow" 的所有權更改為使用者 root,組 wheel

# chown root:wheel /etc/passwd /etc/shadow

相同,但只更改所有者

# chown root: /etc/{passwd,shadow}

相同,但只更改組

# chown :wheel /etc/{passwd,shadow}

Root 將 "/etc/ssh" 中的所有檔案(包括子目錄中的檔案)贈送給使用者 root,組 wheel

# chown -R root:wheel /etc/ssh

相同,但不包括目錄中的檔案(並且隱藏檔案 "/etc/ssh/.*" 也會被遺漏)

# chown root:wheel /etc/ssh/*

使用者 "tux" 將目錄 "/usr/local/src/xc" 從組 "tux" 更改為組 "wheel"。Tux 是這兩個組的成員。

$ ls -ld /usr/local/src/xc
drwxr-xr-x  11 tux  tux  512 Sep 30 16:19 /usr/local/src/xc
$ chown tux:wheel /usr/local/src/xc
$ ls -ld /usr/local/src/xc
drwxr-xr-x  11 tux  wheel  512 Sep 30 16:19 /usr/local/src/xc
chmod
更改檔案模式

chmod 更改檔案的許可權。要理解此命令,必須熟悉 Unix 檔案許可權。有三種許可權:讀取 ("r")、寫入 ("w") 和執行 ("x")。有三種許可權集:針對檔案的所有者 ("u")、針對檔案的組 ("g") 和針對其他使用者 ("o")。

對於檔案,"執行" 意味著將它作為程式執行。對於目錄,需要 "執行" 許可權才能使用該目錄樹中的任何內容,因此對 "/usr/share/doc/README" 執行任何操作都需要對 "/", "/usr"、"/usr/share" 和 "/usr/share/doc" 具有執行許可權。

如果您對更高階的主題(如 set-uid、set-gid、粘滯位和八進位制數)感興趣,請嘗試閱讀 FreeBSD 手冊頁,網址為 http://www.FreeBSD.org/cgi/man.cgi(在表單中輸入 "chmod" 並提交)。

一個有用的選項是

-R
遞迴地更改或設定整個目錄樹的許可權

例子

我們編寫了一個名為 "configure" 的 shell 指令碼。我們使它可執行 ("+x"),然後將其作為命令執行。通常,"+x" 等於 "u+x" 或 "ug+x",具體取決於檔案模式建立掩碼的狀態。

$ chmod +x configure
$ ./configure

允許擁有者執行 "configure"

$ chmod u+x configure

禁止組和其他使用者執行 "configure"

$ chmod go-x configure

對於所有使用者(除了所有者 ("go")),停用對 "~/mail" 和 "~/private" ("-rwx") 的所有訪問許可權。這樣,內容就是私有的,只有其所有者(或 root)才能訪問它們。

$ chmod go-rwx ~/mail ~/private

請注意,在前面的示例中,沒有指定 "-R"。透過停用執行位 ("-x"),~/{mail,private}中的所有檔案都受保護,即使它們的組和其他讀取位已啟用。因此,只需將某個檔案從~/{mail,private}內部移動到像/tmp這樣的公共位置,就可以讓其他使用者再次訪問這些檔案。

"root" 使用者想要設定/usr/local/src以便 "wsrc" 組中的所有使用者(包括 "tux")都可以在其中建立檔案。Root 將繼續擁有該目錄。這可以透過將/usr/local/src的組更改為 "wsrc",然後向組 ("g") 授予讀取、寫入和執行許可權 ("+rwx") 來完成。

# chown :wsrc /usr/local/src
# chmod g+rwx /usr/local/src

所有類 Unix 系統都應允許所有使用者在 "/tmp" 和 "/var/tmp" 中建立臨時檔案。因此,root 將所有許可權 ("+rwx") 授予每個人 ("a",代表 "ugo")。

# chmod a+rwx /tmp /var/tmp

上述問題在於,由於所有使用者對 /tmp 和 /var/tmp 都有寫入許可權,因此每個使用者都可以刪除和重新命名檔案,即使這些檔案不是他們建立的。例如,"tux" 可以建立 "/tmp/socket.3908",而另一個使用者可以刪除它或將其重新命名為 "/tmp/garbage",從而惹惱 Tux。為了保護臨時檔案,我們使用名為 "t" 的粘滯位。這將 /tmp 中檔案的刪除和重新命名限制為 root、/tmp 的所有者(也是 root)和檔案的擁有者("/tmp/socket.3908" 的擁有者是 Tux)。它對 /var/tmp 執行相同的操作。因此,我們應該做的是

# chmod a+rwxt /tmp /var/tmp

更改檔案的組所有權。

連結

建立硬連結。另請參見 ln

連結

刪除檔案。

連結

華夏公益教科書