2021-05-12 14:32:11
Linux之cp命令詳解
Copy Files And Directory
檔案的複製和移動對於大多數計算機愛好者來說是耳熟能詳的,在windows下直接滑鼠右鍵複製貼上,重新命名等等,看著是那麼簡單,但是步驟也不少,但是在Linux中檔案的複製與移動也僅僅就是一句命令就可以實現,下面我們就來看看檔案中的複制命令把..
Name:
cp(copy files and directory)複製檔案和目錄
命令格式:
cp [選項]... SOURCE... DESC
"..."表示原始檔可以有多個因此我們可以從上面得到這樣的結論:
cp只能把一個檔案複製成另一個檔案
cp可以把多個檔案複製到一個目錄裡
3.如果cp後面有很多檔案,那麼最後一個一定是一個目錄
下面我們通過程式碼詳細了解一下cp的實際用法:
[linuxidc@mylab ~]$ cp /etc/man_db.conf /tmp/test
[linuxidc@mylab ~]$ ls /tmp/
anaconda.log storage.log
hsperfdata_root systemd-private-3E1wlM
ifcfg.log systemd-private-cxUWsv
ks-script-5GePg3 systemd-private-StjRUY
packaging.log test
program.log vmware-root
ssh-x1RDJKuGNlHn yum.log
[linuxidc@mylab ~]$
這句命令是把man_db.conf複製到/tmp/下面並且把檔案改名為test
如果目標目錄下存在目標檔案,那麼原始檔的內容就會覆蓋目標檔案
[linuxidc@mylab tmp]$ cp /etc/man_db.conf /tmp/test
[linuxidc@mylab tmp]$ cp /etc/locale.conf /tmp/test
cp:是否覆蓋"/tmp/test"?
這樣是不是很清楚明白呢?大家注意這裡cp的互動是因為在alias中定義了一個alias cp='cp -i'的原因,i是cp的一個選項,實現人機互動的作用,這裡的覆蓋其實相當於把原來的test檔案刪除,然後把原始檔複製到/tmp/下並且改名為test,這一點我們要理解
可是,如果test在/tmp/下是一個目呢?
[linuxidc@mylab tmp]$ cp /etc/man_db.conf /tmp/test
[linuxidc@mylab tmp]$ ls /tmp/test
man_db.conf
[linuxidc@mylab tmp]$
這樣一看就明白了,把原始檔複製到test目錄下,原始檔的名稱不變
下面我們看這樣一段程式碼
[linuxidc@mylab tmp]$ cp /etc/init.d/ /tmp/
cp: 略過目錄"/etc/init.d/"
[linuxidc@mylab tmp]$
這是什麼意思呢,原因很簡單,cp預設機制是複製檔案的,不會複製目錄,可是我們想複製目錄改如何實現呢?
-r:[遞回選項]複製一個目錄及其目錄下的所有檔案
[linuxidc@mylab tmp]$ cp -r /etc/init.d/ /tmp/home
[linuxidc@mylab tmp]$ ls /tmp/home
functions netconsole network README
[linuxidc@mylab tmp]$
這樣大家是不是看明白了呢? -r會把一個目錄以及目錄下的所有的檔案遞回複製出來到目標目錄中,大家仔細看,/tmp下是沒有home目錄的,這樣的執行會直接建立一個home目錄並且home目錄裡面有源目錄的內容,大家理解了嗎
我們假如home是一個檔案,看一看什麼情況
[linuxidc@mylab tmp]$ cp -r /etc/init.d/ /tmp/1
cp: 無法以目錄"/etc/init.d/" 來覆蓋非目錄"/tmp/1"
[linuxidc@mylab tmp]$
會提示你cp: 無法以目錄"/etc/init.d/" 來覆蓋非目錄"/tmp/1",但是在有些系統的版本中是可以執行的,執行的結果就是會覆蓋檔案的內容,並且建立成一個沒有原始檔的錯誤的連結,好這裡大家注意一下就可以了
下面我們看一下cp的一些其它選項
-f:表示強行複製
如果目標檔案存在,不進行人機互動,直接覆蓋檔案內容,是不是很霸道呢?
[linuxidc@mylab tmp]$ cp -f /etc/man_db.conf /tmp/1
[linuxidc@mylab tmp]$
-i:進行人際互動,前面我們講過了
-p:保留檔案的屬主,屬組,時間戳
1234 [linuxidc@mylab tmp]$ cp -p ./storage.log ./storage.log1
[linuxidc@mylab tmp]$ ll
-rw-r--r--. 1 root root 0 3月 9 23:36 storage.log
-rw-r--r--. 1 linuxidc jason 0 3月 9 23:36 storage.log1
-L:複製的是連結,實際上複製的是連結指向的檔案(預設的是-L)
[linuxidc@mylab etc]$ ll
lrwxrwxrwx. 1 root root 13 3月 10 07:19 rc.local -> rc.d/rc.local
[linuxidc@mylab etc]$ cp -L /etc/rc.local /tmp/
[linuxidc@mylab etc]$ ll /tmp
-rw-r--r--. 1 linuxidc jason 473 3月 10 16:59 rc.local
看明白是什麼意思了麼?複製過來後顯示的是一個檔案,檔案的內容是rc.d/rc.local的內容,而不是連結
-P:保持連結自身
[linuxidc@mylab etc]$ cp -P /etc/rc.local /tmp/rc12.local
[linuxidc@mylab etc]ll /tmp
lrwxrwxrwx. 1 linuxidc jason 13 3月 10 17:04 rc12.local -> rc.d/rc.local
原來的是連結,複製過來的還是連結
-d:與-P一樣,複製連結自身
-R:與-r一樣,遞回
-a:same as -dR,猜猜什麼意思j_0006.gif,"歸檔",就是不改變檔案的所有屬性,備份存放
好了,演示到這,cp這個命令我想你一定會是熟記於心了,在回頭鞏固鞏固。
本文永久更新連結地址:http://www.linuxidc.com/Linux/2016-03/129304.htm
相關文章