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
連結
- mkdir,opengroup.org
- mkdir 手冊頁,man.cat-v.org
- 12.3 mkdir 在 GNU Coreutils 手冊中,gnu.org
|
cd 更改當前目錄 |
cd 更改 shell 的當前目錄。此當前目錄將被 shell 啟動的其他程式使用。
由於 "cd" 更改了 shell 的狀態,它是一個shell 內建命令。相反,大多數命令是 shell 啟動的單獨程式。
例子
更改到 'foobar' 目錄
$ cd foobar
更改到您的主目錄,不帶選項的 cd 命令會將您帶回您的主目錄。
$ cd
~ (波浪號) 儲存您主目錄的路徑,此命令與上一個命令具有相同的效果。
$ cd ~
在後面加上使用者名稱,該命令會更改到該特定使用者的家目錄。
$ pwd / $ cd ~user $ pwd /home/user
更改到父目錄
$ cd ..
更改到上一個目錄
$ cd -
提示
"CDPATH" 可能只在某些 shell 中有效。例如,ksh 擁有它。 |
透過在您的 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
連結
rm
[edit | edit source]|
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
連結
- rmdir, opengroup.org
- rmdir 手冊頁, freebsd.org
- 12.7 rmdir 在 GNU Coreutils 手冊中,gnu.org
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
連結
- touch, opengroup.org
- touch 手冊頁, man.cat-v.org
- 13.4 touch 在 GNU Coreutils 手冊中,gnu.org
df
[edit | edit source]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
連結
du
[edit | edit source]顯示磁碟使用情況。
連結
ln
[edit | edit source]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
更改檔案的組所有權。
連結
- chgrp 在 The Open Group Base Specifications Issue 7 中,pubs.opengroup.org
- 13.2 chgrp:更改組所有權 在 GNU Coreutils 中,gnu.org
- W:Chgrp
建立硬連結。另請參見 ln。
連結
刪除檔案。
連結