在Ubuntu系統中,複製文件和目錄最常用的命令是cp。除了基礎的“複製單個文件”用法,cp還有很多高級功能,能幫你高效處理文件操作,比如批量複製、目錄遞歸複製、保留文件屬性等。下面我們就來看看這些實用的高級用法,配合例子讓你快速上手。
1. 批量複製多個文件到目標目錄¶
如果需要把多個文件(比如所有文本文件、圖片等)一次性複製到某個目錄,不用一個個輸入命令,直接用通配符*就能批量處理。
例子:假設當前目錄有 a.txt、b.txt、c.txt 三個文本文件,想把它們全部複製到名爲 docs 的目錄下。
先確保 docs 目錄已存在(不存在的話用 mkdir docs 創建),然後執行:
cp *.txt docs/
解釋:*.txt 會匹配當前目錄下所有以 .txt 結尾的文件,docs/ 是目標目錄。執行後,docs 文件夾裏就會包含這三個文本文件。
2. 複製整個目錄(包括子文件夾和內容)¶
如果目標是一個文件夾,且裏面有子文件夾或子文件,直接用 cp 只能複製文件夾本身,無法複製內容。這時需要加 -r 參數(遞歸複製,recursive)。
例子:假設當前目錄有個 work 文件夾,裏面包含 src 子文件夾和 data.txt 文件,現在要把整個 work 目錄複製到 backup 文件夾下。
執行:
cp -r work/ backup/
解釋:-r 會讓 cp 遞歸遍歷 work 目錄下的所有子文件夾和文件,把整個目錄結構“搬”到 backup 裏。如果不加 -r,backup 裏只會有 work 文件夾的空殼,裏面的內容不會被複制。
3. 保留文件屬性(權限、時間戳等)¶
有時候複製文件後,發現權限變了(比如原本是隻讀文件,複製後變成可寫),或者修改時間被重置了。這時用 -a 參數(歸檔,archive)可以保留文件的幾乎所有屬性,包括權限、所有者、時間戳等。
例子:把系統配置文件 /etc/hosts 複製到 /tmp 目錄,並重命名爲 hosts.bak,保留原始屬性:
cp -a /etc/hosts /tmp/hosts.bak
解釋:-a 會讓 hosts.bak 完全繼承原文件的權限、所屬用戶、修改時間等,不是簡單地複製內容。如果用默認參數,可能權限會變成系統默認(比如 -rw-r--r-- 變成 -rw-r--r-- 但時間戳被重置)。
4. 交互式複製,避免誤覆蓋¶
如果目標位置已經有同名文件,直接 cp 會默認覆蓋(可能丟失數據)。加上 -i 參數(交互式,interactive),cp 會先詢問你是否覆蓋,確認後才執行。
例子:把 old.txt 複製到當前目錄的 new.txt(如果 new.txt 已存在):
cp -i old.txt new.txt
解釋:執行後,終端會顯示 new.txt: 目標存在,是否覆蓋? [y/n]。輸入 y 確認覆蓋,輸入 n 取消複製,避免誤操作。
5. 複製軟鏈接本身(或其指向的內容)¶
軟鏈接(symlink)是一種特殊的文件,它只是“指向”另一個文件,而不是複製內容。cp 默認會複製軟鏈接指向的文件內容,但如果你想複製軟鏈接本身(創建一個新的軟鏈接),需要用 -P 參數(不跟隨符號鏈接,–no-dereference)。
例子:先創建一個軟鏈接 link.txt 指向 source.txt:
ln -s source.txt link.txt
如果想複製軟鏈接本身到 new_link(即 new_link 也是指向 source.txt 的軟鏈接),執行:
cp -P link.txt new_link
解釋:-P 會讓 cp 不跟隨軟鏈接指向的內容,直接複製軟鏈接本身。如果不用 -P,new_link 會變成一個和 source.txt 內容完全一樣的普通文件(而非軟鏈接)。
6. 複製並直接重命名¶
如果想把文件複製到目標位置的同時重命名,可以直接在目標路徑中指定新文件名。
例子:把 a.txt 複製到 docs 目錄,並改名爲 memo.txt:
cp a.txt docs/memo.txt
解釋:目標路徑 docs/memo.txt 中的 memo.txt 就是新文件名,執行後 docs 目錄下會有 memo.txt,內容和 a.txt 完全一樣。
總結¶
cp 命令的這些高級用法能解決日常工作中很多常見問題:
- 用 *.txt docs/ 批量複製多個文件;
- 用 -r 遞歸複製整個目錄(包括子文件夾);
- 用 -a 保留文件原始屬性;
- 用 -i 避免誤覆蓋文件;
- 用 -P 處理軟鏈接的複製。
剛開始可能覺得參數多記不住,但多動手練習幾次(比如創建測試文件、目錄、軟鏈接),很快就能熟練掌握。遇到複雜場景時,記得查 man cp 或 cp --help 獲取詳細參數說明哦!