文件查找、過濾、打包、傳輸是 Linux 日常運維高頻動作。本文系統整理 locate、grep、tar、find、scp 五大命令的核心參數、典型組合與避坑指南,提升命令行效率。
# 更新數據庫 (需 root,通常每日定時任務自動運行)
updatedb
# 查找包含關鍵字的路徑
locate nginx.conf
locate -i "*.log" # 忽略大小寫
locate -r "^/etc/.*conf$" # 正則匹配
locate -c pattern # 僅統計數量
locate -e pattern # 僅輸出當前存在的 (排除已刪除)
# 限制搜索範圍 (需構建自定義數據庫)
updatedb -l 0 -o /var/lib/mlocate/custom.db -U /home
locate -d /var/lib/mlocate/custom.db pattern
優勢:極快 (索引查找);劣勢:非實時、無法按權限/大小/時間過濾、需定期 updatedb。
# 基礎用法
grep "error" /var/log/messages
grep -i "error" file # 忽略大小寫
grep -v "debug" file # 反向匹配 (排除)
grep -n "pattern" file # 顯示行號
grep -c "pattern" file # 統計匹配行數
grep -l "pattern" *.conf # 僅輸出文件名
grep -r "pattern" /etc/ # 遞歸目錄
# 正則增強
grep -E "error|fail|critical" file # 擴展正則 (或)
grep -P "(\d{1,3}\.){3}\d{1,3}" file # Perl 正則 (IP)
grep -w "root" file # 全詞匹配
grep -A 3 -B 2 "pattern" file # 顯示匹配行前 2 行、後 3 行
grep -C 5 "pattern" file # 前後各 5 行上下文
# 輸出控制
grep -o "pattern" file # 僅輸出匹配部分 (每行一個)
grep -h "pattern" file1 file2 # 不顯示文件名
grep --color=auto "pattern" file # 高亮 (別名常默認開啟)
# 從日志提取 IP 並統計 Top 10
grep -oE '([0-9]{1,3}\.){3}[0-9]{1,3}' access.log | sort | uniq -c | sort -nr | head -10
# 查找包含特定字符串的進程完整命令行
ps aux | grep -v grep | grep "nginx"
# 批量替換文件內容 (配合 sed)
grep -rl "old_string" /etc/app/ | xargs sed -i 's/old_string/new_string/g'
| 選項 | 功能 |
|---|---|
-c | 創建歸檔 |
-x | 解壓歸檔 |
-t | 列出歸檔內容 |
-u | 更新歸檔 (僅較新文件) |
-r | 追加文件到歸檔末尾 |
| 選項 | 功能 |
|---|---|
-f FILE | 指定歸檔文件 (必須) |
-v | 詳細輸出 |
-z | gzip 壓縮/解壓 (.tar.gz/.tgz) |
-j | bzip2 壓縮/解壓 (.tar.bz2/.tbz2) |
-J | xz 壓縮/解壓 (.tar.xz/.txz) 推薦:壓縮率最高 |
-p | 保留權限 (root 解壓默認開啟) |
-C DIR | 指定解壓/歸檔目錄 |
--exclude=PATTERN | 排除模式 |
--strip-components=N | 解壓時去除前 N 級目錄 |
# 打包排除 .git、node_modules、*.log
tar -czf /backup/app-$(date +%F).tar.gz \
--exclude=.git --exclude=node_modules --exclude="*.log" \
-C /home/wwwroot app/
# 解壓到指定目錄,保留權限
tar -xzf app.tar.gz -C /opt/app --strip-components=1
# 列出內容不解壓
tar -tzf app.tar.gz | head -20
# 異地備份 (通過 SSH 管道)
tar -czf - /home/wwwroot/app | ssh user@backup "cat > /backup/app-$(date +%F).tar.gz"
| 條件 | 功能 | 示例 |
|---|---|---|
-name PATTERN | 文件名匹配 (通配符) | -name "*.conf" |
-iname PATTERN | 忽略大小寫 | -iname "readme*" |
-path PATTERN | 完整路徑匹配 | -path "*/.git/*" |
-type TYPE | 文件類型 | f/d/l/c/b/p/s (文件/目錄/鏈接/字符/塊/管道/Socket) |
-size N[cwbkMG] | 文件大小 | -size +100M >100MB, -size -1k <1KB |
-perm MODE | 權限精確匹配 | -perm 644 |
-perm -MODE | 權限包含 (所有位) | -perm -u=x 擁有者可執行 |
-perm /MODE | 權限任意位匹配 | -perm /u=x,g=x |
-user NAME | 擁有者用戶名 | -user www |
-group NAME | 所屬組名 | -group www |
-mtime N | 修改時間 N 天前 | -mtime +30 30天前, -mtime -7 7天內 |
-mmin N | 修改時間 N 分鐘前 | -mmin -60 1小時內 |
-atime N | 訪問時間 | -atime +365 一年未訪問 |
-ctime N | 狀態改變時間 | -ctime -1 1天內屬性變更 |
-empty | 空文件/目錄 | |
-links N | 硬鏈接數 | -links +1 硬鏈接文件 |
| 動作 | 功能 | 示例 |
|---|---|---|
-print | 輸出路徑 (默認) | |
-print0 | NUL 分隔輸出 (配合 xargs -0) | |
-exec CMD {} \; | 對每個結果執行命令 | -exec chmod 644 {} \; |
-exec CMD {} + | 批量執行 (參數列表) | -exec rm {} + 效率高得多 |
-ok CMD {} \; | 交互確認執行 | |
-delete | 直接刪除 (慎用!) | -name "*.tmp" -delete |
-printf FORMAT | 格式化輸出 | -printf "%p %s %TY-%Tm-%Td\n" |
# 1. 查找大於 100MB 的日志文件並壓縮
find /var/log -type f -name "*.log" -size +100M -exec gzip {} \;
# 2. 清理 30 天前的臨時文件
find /tmp -type f -mtime +30 -delete
# 3. 查找擁有 SUID 位的可疑文件
find / -type f -perm -4000 ! -path "/usr/bin/*" ! -path "/bin/*" -ls
# 4. 批量重命名: .jpeg -> .jpg
find . -type f -name "*.jpeg" -exec bash -c 'mv "$1" "${1%.jpeg}.jpg"' _ {} \;
# 5. 複雜條件: 修改時間 7 天內、大於 1MB、非 .git 目錄的文件
find /home/wwwroot -type f -mtime -7 -size +1M ! -path "*/.git/*" -printf "%p %s %TY-%Tm-%Td\n"
# 本地 -> 遠程
scp file.txt user@host:/remote/path/
scp -r dir/ user@host:/remote/path/
# 遠程 -> 本地
scp user@host:/remote/file.txt /local/path/
scp -r user@host:/remote/dir/ /local/path/
# 遠程 -> 遠程 (經本地中轉)
scp user1@host1:/path/file user2@host2:/path/
# 關鍵參數
scp -P 2222 # 指定 SSH 端口
scp -i ~/.ssh/id_rsa # 指定私鑰
scp -l 10000 # 限制帶寬 10000 Kbit/s
scp -p # 保留修改時間、權限、模式
scp -C # 啟用壓縮 (低帶寬環境)
scp -o StrictHostKeyChecking=no # 自動接受新主機指紋 (自動化腳本)
scp -r -o ConnectTimeout=10 # 連接超時 10s
#!/bin/bash
HOSTS="web1 web2 web3 db1"
LOCAL="/opt/app/config.yaml"
REMOTE="/etc/app/config.yaml"
for h in $HOSTS; do
echo "Deploying to $h..."
scp -i ~/.ssh/deploy_key -o ConnectTimeout=5 "$LOCAL" "deploy@$h:$REMOTE" && \
ssh -i ~/.ssh/deploy_key "deploy@$h" "systemctl reload app" || \
echo "FAILED: $h"
done
updatedb)。find -exec grep 或 xargs grep)。ssh 管道或 scp)。Linux 使用 OpenSSL 自簽 SSL 憑證完整教學:4096 位金鑰、去密碼、Nginx 配置實戰
Linux 桌面安全九大實用技巧:從鎖屏到 SELinux 的纵深防護
Linux 核心 Oops 錯誤訊息完整解讀:從空指標範例看 Call Trace、錯誤碼與 Tainted 旗標含義
Linux 下部署 XFS 高效能日誌檔案系統:核心編譯、工具安裝與效能調校全紀錄
Linux 核心崩潰分析完整指南:kdump 部署、vmcore 收集與 crash 工具實戰
SecureCRT 中使用 sz/rz 實現高效檔案傳輸完整指南