Linux 與 Ubuntu
這個分類下的問題與解答。點標題可以展開答案,也可以點右上角進到單題頁面。
在 Linux 刪除資料夾用 rm -r(空資料夾也可以用 rmdir),刪除檔案用 rm。下面先列出最常用的指令,再依情況說明用法與注意事項。
| 要做的事 | 指令 |
|---|---|
| 刪除一個檔案 | rm 檔名 |
| 刪除空的資料夾 | rmdir 資料夾 |
| 刪除資料夾(含裡面所有檔案與子資料夾) | rm -r 資料夾 |
| 強制刪除資料夾,不逐一詢問 | rm -rf 資料夾 |
| 清空資料夾,但保留資料夾本身 | find 資料夾 -mindepth 1 -delete |
| 只刪除資料夾裡的檔案,保留子資料夾 | find 資料夾 -type f -delete |
一、刪除資料夾:rm -r、rm -rf 與 rmdir
刪除空的資料夾:rmdir
rmdir mydir
rmdir 只能刪除空的資料夾。資料夾裡還有東西時會出現「Directory not empty」並停止,不會刪掉任何檔案,所以它是最安全的刪除方式。
刪除資料夾與裡面的所有內容:rm -r
rm -r mydir
-r 是「遞迴」(recursive)的意思:不管裡面有多少層子資料夾,會連同所有檔案一起刪除。遇到唯讀的檔案時,系統會一個一個詢問是否刪除。
強制刪除,不詢問:rm -rf
rm -rf /var/log/httpd/access
-f 是「強制」(force):不詢問、不提示,檔案不存在也不會報錯。上面這行會刪除 /var/log/httpd/access 資料夾,以及它底下所有的檔案與子資料夾。
rm -rf 是最常用、也最危險的刪除指令,執行前請先看第五節的注意事項。
刪除前逐一確認:rm -ri
rm -ri mydir
加上 -i 之後,每刪除一個檔案或資料夾都會先詢問,適合不確定裡面有什麼的時候。
二、刪除檔案:rm 的基本用法
rm file.txt # 刪除一個檔案
rm file1.txt file2.txt # 一次刪除多個檔案
rm *.log # 刪除目前資料夾裡所有 .log 檔
rm -f access.log # 強制刪除,不詢問
rm -i file.txt # 刪除前先詢問
刪除其他資料夾裡的檔案,在檔名前面加上路徑即可,例如 rm -f /var/log/httpd/access.log。
三、清空資料夾,但保留資料夾本身
常見的需求是「把資料夾裡的東西都刪掉,但資料夾留著」,例如清空快取或暫存資料夾。依照要刪除的範圍,有三種做法:
| 指令 | 刪除的範圍 |
|---|---|
rm -rf mydir/* | 檔案與子資料夾,但不包含隱藏檔(以 . 開頭的檔案,例如 .htaccess) |
find mydir -mindepth 1 -delete | 裡面的所有東西,包含隱藏檔,只保留 mydir 本身 |
find mydir -type f -delete | 只刪除檔案,子資料夾的結構保留 |
只想刪除目前所在資料夾的檔案,把 mydir 換成 . 即可,例如 find . -type f -delete。
四、檔案太多,出現「Argument list too long」
資料夾裡有幾萬個檔案時,執行 rm * 可能會出現「Argument list too long」,因為 * 展開後的檔名超過系統的長度限制。這時改用 find:
find mydir -type f -delete
或是搭配 xargs 分批刪除。檔名裡有空白時,要加上 -print0 與 -0,才不會被拆成兩個檔名:
find mydir -type f -print0 | xargs -0 rm -f
只想刪除特定檔案時,可以加上條件,例如刪除 30 天以前的 .log 檔:
find /var/log/myapp -type f -name "*.log" -mtime +30 -delete
五、刪除之前,先確認這幾件事
Linux 的指令列沒有資源回收筒,rm 刪掉的檔案無法從系統裡救回來。執行前建議養成這幾個習慣:
- 先列出、再刪除:用
find時,先把-delete拿掉執行一次,確認列出來的就是要刪的檔案,再把-delete加回去。用rm時,可以先用ls看一次同樣的路徑。 - 確認目前所在的位置:執行
rm -rf *之前,先用pwd確認自己在哪個資料夾。在錯的資料夾執行,就會刪錯東西。 - 寫在程式裡的路徑要防呆:腳本裡寫
rm -rf "$DIR"/*,如果$DIR剛好是空的,就會變成rm -rf /*。可以改寫成rm -rf "${DIR:?}"/*,變數為空時指令會直接停止。 - 小心 sudo:加上
sudo之後,系統檔案也刪得掉。多數發行版的rm預設會擋下rm -rf /,但rm -rf /*這類寫法擋不住。 - 重要資料先備份:正式主機上的網站檔案或資料庫,刪除前先備份,誤刪時才有辦法還原。
要安裝 ssh server, 以下兩行指令都可以
# apt-get install ssh # apt-get install openssh-server
安裝後可以修改一些 ssh 的設定, 如port, 密碼認證, root登入等
# vim /etc/ssh/sshd_config
Port 22 PasswordAuthentication yes PermitRootLogin yes -> 是否開放 root 登入更改完存檔後記得重啟服務
# /etc/init.d/ssh restart
台灣的光世代、ADSL 等寬頻,很多是用 PPPoE 撥接取得 IP。Ubuntu 設定 PPPoE 有兩種做法:有安裝 NetworkManager 的電腦用 nmcli,或使用傳統的 pppoeconf 工具。開始前請準備 ISP 提供的撥接帳號與密碼,並確認接數據機的網卡名稱:
ip link
網卡名稱通常是 enp1s0、eth0 這類名稱,以下範例以 enp1s0 表示,請換成自己的網卡。
方法一:nmcli(NetworkManager)
Ubuntu 桌面版預設使用 NetworkManager;伺服器版若有安裝 NetworkManager,也可以用這個方法。
建立撥接設定
sudo nmcli connection add type pppoe con-name hinet ifname enp1s0 username 撥接帳號 password 撥接密碼
hinet 是這組設定的名稱,可以自己取。
撥接、中斷與開機自動撥接
sudo nmcli connection up hinet
sudo nmcli connection down hinet
sudo nmcli connection modify hinet connection.autoconnect yes
方法二:pppoeconf
安裝
sudo apt install pppoeconf
環境設定
sudo pppoeconf
依畫面指示選擇網卡、輸入撥接帳號密碼,並選擇是否開機自動撥接。設定會存在 /etc/ppp/peers/dsl-provider。
撥接與中斷
sudo pon dsl-provider
sudo poff -a
pon 後面接的是設定名稱 dsl-provider;poff -a 會中斷所有撥接連線。
注意:pppoeconf 會一併安裝 ifupdown,以傳統的 /etc/network/interfaces 管理網路。新版 Ubuntu 伺服器預設用 netplan 管理網路,兩者同時管理同一張網卡可能互相衝突,伺服器上使用前請先確認目前的網路設定方式。
確認撥接是否成功
ip addr show ppp0
撥接成功時會出現 ppp0 介面與 ISP 配發的 IP。撥接失敗時,用下面的指令查看撥接紀錄:
plog
常見原因是帳號密碼錯誤、網卡選錯,或數據機本身已經在撥接(數據機設成路由模式時,電腦端就不需要再撥接)。
Ubuntu 預設只內建一個 PHP 版本:Ubuntu 26.04 是 PHP 8.5,Ubuntu 24.04 是 PHP 8.3。網站需要其他版本,或要在同一台主機上同時跑多個版本時,就要加入 Ondřej Surý 維護的第三方套件來源。這篇整理安裝步驟、切換版本的方法,以及各版本的支援期限。
一、先確認要裝哪個版本
PHP 每個版本有 2 年的完整支援,之後再提供 2 年的安全性修補。依 php.net 公布的支援期限,目前仍有支援的版本是:
| 版本 | 發布日期 | 完整支援到 | 安全性修補到 |
|---|---|---|---|
| PHP 8.2 | 2022-12-08 | 2024-12-31 | 2026-12-31 |
| PHP 8.3 | 2023-11-23 | 2025-12-31 | 2027-12-31 |
| PHP 8.4 | 2024-11-21 | 2026-12-31 | 2028-12-31 |
| PHP 8.5 | 2025-11-20 | 2027-12-31 | 2029-12-31 |
這篇舊版介紹的 PHP 7.3、7.4、8.0,以及 8.1,都已經停止支援,不會再有安全性更新。還在用這些版本的網站,建議盡快規劃升級程式,而不是繼續安裝舊版本。
二、加入套件來源
Ubuntu 22.04、24.04:ppa:ondrej/php
sudo apt install software-properties-common
sudo add-apt-repository ppa:ondrej/php
sudo apt update
Ubuntu 26.04:packages.sury.org
ppa:ondrej/php 沒有提供 Ubuntu 26.04 的套件,維護者正把套件移到 packages.sury.org。26.04 依官方的設定步驟加入:
sudo apt-get update
sudo apt-get -y install lsb-release ca-certificates curl
sudo curl -sSLo /tmp/debsuryorg-archive-keyring.deb https://packages.sury.org/debsuryorg-archive-keyring.deb
sudo dpkg -i /tmp/debsuryorg-archive-keyring.deb
sudo sh -c 'echo "deb [signed-by=/usr/share/keyrings/debsuryorg-archive-keyring.gpg] https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list'
sudo apt-get update
三、安裝指定版本
以 PHP 8.4 為例,其他版本把指令中的 8.4 換掉即可。各版本的套件可以並存,不會互相覆蓋。
搭配 NGINX 或 Apache 使用 PHP-FPM
sudo apt install php8.4-fpm php8.4-common php8.4-curl php8.4-gd php8.4-intl php8.4-mbstring php8.4-mysql php8.4-xml
Virtualmin 以 FCGI 模式執行
sudo apt install php8.4-cgi php8.4-common php8.4-curl php8.4-gd php8.4-intl php8.4-mbstring php8.4-mysql php8.4-xml
裝好後用 php8.4 -v 確認版本。
四、切換版本
命令列的預設版本
輸入 php 時執行哪個版本,用下面的指令選擇:
sudo update-alternatives --config php
這只影響命令列,例如排程與 Composer,不影響網站實際使用的版本。
網站使用的版本
網站用哪個版本,是在網站伺服器的設定裡指定的,每個網站可以不同:
- NGINX:在網站設定的
fastcgi_pass指向該版本的 socket,例如unix:/run/php/php8.4-fpm.sock - Virtualmin:在該網站的 PHP 設定中選擇版本
切換前先確認網站程式支援新版本,切換後檢查網站與錯誤記錄。
五、注意事項
- NGINX 的套件來源:在 Ubuntu 22.04、24.04 上,NGINX 主機可以另外加入
ppa:ondrej/nginx。使用 Virtualmin./install.sh --bundle LEMP安裝的主機請勿加入,請使用 Virtualmin 內建的 NGINX - 更新套件:加入套件來源後,用
sudo apt update更新清單、sudo apt upgrade更新套件,遇到相依性問題時先停下來確認,不要強制更新 - 慎用 apt autoremove:在 Ubuntu 22.04 上,
sudo apt autoremove可能移除舊系統仍需要的套件,執行前先看清楚它要移除哪些套件 - 移除不用的版本:確認沒有網站在使用後,再移除該版本的套件,避免主機上留著沒有安全更新的版本
系統更新時會安裝新的 kernel 核心,舊的 kernel 會留在主機上,以便新 kernel 有問題時可以退回。累積太多會佔滿 /boot 的空間,導致之後的更新失敗。管理方式是設定「最多保留幾個 kernel」,並清掉已經用不到的舊版本。
要先說明:CentOS Linux 已經停止支援,CentOS 8 在 2021 年底、CentOS 7 在 2024 年 6 月 30 日結束,不會再有安全性更新。目前常見的後繼系統是 Rocky Linux 與 AlmaLinux,下面分別說明。
一、先確認目前的 kernel
rpm -q kernel
uname -r
rpm -q kernel 列出已安裝的所有 kernel,uname -r 顯示目前正在使用的版本。清理時一定要保留正在使用的版本,以及至少一個備用版本。
二、Rocky Linux、AlmaLinux(dnf)
設定保留數量
編輯 /etc/dnf/dnf.conf,修改 installonly_limit,預設是 3:
installonly_limit=3
這個設定在下次安裝新 kernel 時才會生效,超過數量的最舊版本會被自動移除;改完設定或重開機,都不會立刻刪掉已經安裝的 kernel。
清掉已經安裝的舊 kernel
sudo dnf remove --oldinstallonly kernel
執行後 dnf 會列出要移除的套件,先確認清單裡沒有正在使用的版本,再按 y 確認。這個指令在不同 dnf 版本的行為略有差異,有些版本會移除最新版以外的所有舊 kernel,不會參考保留數量的設定。
三、CentOS 7(yum)
設定保留數量
編輯 /etc/yum.conf,修改 installonly_limit,CentOS 7 預設是 5。同樣要等下次安裝新 kernel 時才會生效。
清掉已經安裝的舊 kernel
先安裝 yum-utils,再用 package-cleanup 清理,--count 是要保留的數量:
sudo yum install -y yum-utils
sudo package-cleanup --oldkernels --count=2
四、注意事項
- 至少保留兩個:只留一個 kernel,新版開不了機時就沒有可以退回的版本
- 不要手動刪 /boot 裡的檔案:一定要用套件管理工具移除,否則開機選單與套件紀錄會不一致
- 還在用 CentOS 7 的主機:已經沒有安全性更新,建議規劃移轉到 Rocky Linux、AlmaLinux 等仍有支援的系統,見主機搬遷的完整流程
我來說明如何在Ubuntu 24.04上設定網卡enp1s0的IP位址。在Ubuntu 24.04中,我們使用netplan來進行網路設定。以下是具體步驟:
- 首先確認網卡名稱:
baship addr show
- 編輯netplan配置文件(通常位於/etc/netplan/目錄下):
bashsudo nano /etc/netplan/00-installer-config.yaml
- 在配置文件中加入以下內容(根據您的需求修改IP位址):
yamlnetwork: version: 2 renderer: networkd ethernets: enp1s0: addresses: - 192.168.1.100/24 # 您想要設定的IP位址和子網路遮罩 routes: - to: default via: 192.168.1.1 # 預設閘道 nameservers: addresses: [8.8.8.8, 8.8.4.4] # DNS伺服器
- 套用設定:
bashsudo netplan apply
- 驗證設定是否成功:
baship addr show enp1s0
如果您想要使用DHCP自動取得IP位址,則可以將配置改為:
yamlnetwork: version: 2 renderer: networkd ethernets: enp1s0: dhcp4: true
需要注意的事項:
- 請確保IP位址不會與網路中其他設備衝突
- 子網路遮罩(/24)要與您的網路環境相符
- 閘道位址要設定成您實際的網路閘道
當使用netplan apply出現permissions for xxx are too opne
這個錯誤是因為netplan配置文件的權限太寬鬆了。我們需要修改檔案權限,具體操作如下:
- 首先修改檔案權限:
bashsudo chmod 600 /etc/netplan/xxx.yaml
這個指令會將權限設定為只有root可以讀寫(600)。
- 確認檔案擁有者:
bashsudo chown root:root /etc/netplan/xxx.yaml
- 然後再次執行:
bashsudo netplan apply
這樣應該就能解決權限問題了。權限600的含義是:
- 擁有者(root): 可讀寫 (6)
- 群組: 無權限 (0)
- 其他使用者: 無權限 (0)
這是netplan配置文件的建議權限設定,因為這些檔案包含網路配置信息,需要較嚴格的權限控制。
準備好讓網站 開始幫你帶生意了嗎?
不論是要做新網站、救舊網站,還是只想先聊聊方向——先諮詢,不用先付錢,我們照實給你建議。

