1,首先需要了解cp的原理。
創(chuàng)新互聯(lián)建站專注于吉木薩爾企業(yè)網(wǎng)站建設(shè),自適應(yīng)網(wǎng)站建設(shè),成都做商城網(wǎng)站。吉木薩爾網(wǎng)站建設(shè)公司,為吉木薩爾等地區(qū)提供建站服務(wù)。全流程按需網(wǎng)站策劃,專業(yè)設(shè)計,全程項目跟蹤,創(chuàng)新互聯(lián)建站專業(yè)和態(tài)度為您提供的服務(wù)
2,可以參考cp的源碼去了解其原理
3,cp命令的源碼可以在linux內(nèi)核中找到。
4,或者下載busybox其中也會有cp的源碼
只有了解其原理之后才能談如何實現(xiàn)。參考代碼如下:
#include?stdio.h
#include?stdlib.h
#include?sys/stat.h
#include?sys/types.h
#include?fcntl.h
#include?errno.h
#include?unistd.h
#include?string.h
#define?BUF_SIZE?1024
#define?PATH_LEN?128
void?my_err(char?*err_string,?int?line?)
{
fprintf(stderr,"line:%d?",line);
perror(err_string);?
exit(1);
}
void?copy_data(const?int?frd,const?int?fwd)
{
int?read_len?=?0,?write_len?=?0;
unsigned?char?buf[BUF_SIZE],?*p_buf;
while?(?(read_len?=?read(frd,buf,BUF_SIZE))?)?{
if?(-1?==?read_len)?{
my_err("Read?error",?__LINE__);
}
else?if?(read_len??0)?{?//把讀取部分寫入目標(biāo)文件
p_buf?=?buf;
while?(?(write_len?=?write(fwd,p_buf,read_len))?)?{
if(write_len?==?read_len)?{
break;
}
else?if?(write_len??0)?{?//只寫入部分
p_buf?+=?write_len;
read_len?-=?write_len;
}
else?if(-1?==?write_len)?{
my_err("Write?error",?__LINE__);
}
}
if?(-1?==?write_len)?break;
}
}
}
int?main(int?argc,?char?**argv)?
{
int?frd,?fwd;?//讀寫文件描述符
int?len?=?0;
char?*pSrc,?*pDes;?//分別指向源文件路徑和目標(biāo)文件路徑
struct?stat?src_st,des_st;
if?(argc??3)?{
printf("用法?./MyCp?源文件路徑?目標(biāo)文件路徑\n");
my_err("arguments?error?",?__LINE__);
}
frd?=?open(argv[1],O_RDONLY);
if?(frd?==?-1)?{
my_err("Can?not?opne?file",?__LINE__);
}
if?(fstat(frd,src_st)?==?-1)?{
my_err("stat?error",__LINE__);
}
/*檢查源文件路徑是否是目錄*/
if?(S_ISDIR(src_st.st_mode))?{
my_err("略過目錄",__LINE__);
}
pDes?=?argv[2];
stat(argv[2],des_st);
if?(S_ISDIR(des_st.st_mode))?{?//目標(biāo)路徑是目錄,則使用源文件的文件名
len?=?strlen(argv[1]);
pSrc?=?argv[1]?+?(len-1);?//指向最后一個字符
/*先找出源文件的文件名*/
while?(pSrc?=?argv[1]??*pSrc?!=?'/')?{
pSrc--;
}
pSrc++;//指向源文件名
len?=?strlen(argv[2]);?
//?.?表示復(fù)制到當(dāng)前工作目錄
if?(1?==?len??'.'?==?*(argv[2]))?{
len?=?0;?//沒有申請空間,后面就不用釋放
pDes?=?pSrc;
}
else?{?//復(fù)制到某目錄下,使用源文件名
pDes?=?(char?*)malloc(sizeof(char)*PATH_LEN);
if?(NULL?==?pDes)?{
my_err("malloc?error?",?__LINE__);
}
strcpy(pDes,argv[2]);
if?(?*(pDes+(len-1))?!=?'/'?)?{?//目錄缺少最后的'/',則補上’/‘
strcat(pDes,"/");
}
strcat(pDes+len,pSrc);
}
}
/*?打開目標(biāo)文件,?使權(quán)限與源文件相同*/?
fwd?=?open(pDes,O_WRONLY?|?O_CREAT?|?O_TRUNC,src_st.st_mode);
if?(fwd?==?-1)?{
my_err("Can?not?creat?file",?__LINE__);
}
copy_data(frd,fwd);
//puts("end?of?copy");
if?(len??0??pDes?!=?NULL)
free(pDes);
close(frd);
close(fwd);
return?0;
}
linux復(fù)制命令cp。
cp命令主要用來復(fù)制文件和目錄,語法“cp [選項] 源文件 目標(biāo)文件”,可以將一個或多個源文件或目錄復(fù)制到指定文件或目錄下;同時借助某些選項,還可以實現(xiàn)復(fù)制整個目錄,以及比對兩文件的新舊而予以升級等功能。
含義
一般的Linux使用者均為普通用戶,而系統(tǒng)管理員一般使用超級用戶帳號完成一些系統(tǒng)管理的工作。如果只需要完成一些由普通帳號就能完成的任務(wù),建議不要使用超級用戶帳號,以免無意中破壞系統(tǒng)。影響系統(tǒng)的正常運行。
用戶登錄分兩步:第一步,輸入用戶的登錄名,系統(tǒng)根據(jù)該登錄名識別用戶;第二步,輸入用戶的口令,該口令是用戶自己設(shè)置的一個字符串,對其他用戶是保密的,是在登錄時系統(tǒng)用來辨別真假用戶的關(guān)鍵字。
cp命令
該命令的功能是將給出的文件或目錄拷貝到另一文件或目錄中,同MSDOS下的copy命令一樣,功能十分強大。
語法: cp [選項] 源文件或目錄 目標(biāo)文件或目錄
說明:該命令把指定的源文件復(fù)制到目標(biāo)文件或把多個源文件復(fù)制到目標(biāo)目錄中。
該命令的各選項含義如下:
- a 該選項通常在拷貝目錄時使用。它保留鏈接、文件屬性,并遞歸地拷貝目錄,其作用等于dpR選項的組合。
- d 拷貝時保留鏈接。
- f 刪除已經(jīng)存在的目標(biāo)文件而不提示。
- i 和f選項相反,在覆蓋目標(biāo)文件之前將給出提示要求用戶確認?;卮饄時目標(biāo)文件將被覆蓋,是交互式拷貝。
- p 此時cp除復(fù)制源文件的內(nèi)容外,還將把其修改時間和訪問權(quán)限也復(fù)制到新文件中。
- r 若給出的源文件是一目錄文件,此時cp將遞歸復(fù)制該目錄下所有的子目錄和文件。此時目標(biāo)文件必須為一個目錄名。
- l 不作拷貝,只是鏈接文件。
需要說明的是,為防止用戶在不經(jīng)意的情況下用cp命令破壞另一個文件,如用戶指定的目標(biāo)文件名已存在,用cp命令拷貝文件后,這個文件就會被新源文件覆蓋,因此,建議用戶在使用cp命令拷貝文件時,最好使用i選項。
例子:
Cp -i file1 file2 (將文檔 file1 復(fù)制成 file2 . –i為提示確認。)
cp file1 dir1 將文檔 file1 復(fù)制到目錄 dir1 下,文件名仍為 file1.
cp /tmp/file1 . 將目錄 /tmp 下的文檔 file1復(fù)制到現(xiàn)行目錄下,檔名仍為 file1.
cp /tmp/file1 file2 將目錄 /tmp 下的文檔 file1現(xiàn)行目錄下,檔名為file2
cp -r dir1 dir2 (recursive copy) 復(fù)制整個目錄.若目錄 dir2 不存在,則將目錄dir1,及其所有文檔和子目錄,復(fù)制到目錄 dir2 下,新目錄名稱為dir1.若目錄dir2不存在,則將dir1,及其所有文檔和子目錄,復(fù)制為目錄 dir2.
linux編輯文件命令有如下:
1、cp命令,作用復(fù)制,參數(shù)如下:
-a:將文件的特性一起復(fù)制。
-p:連同文件的屬性一起復(fù)制,而非使用默認方式,與-a相似,常用于備份。
-i:若目標(biāo)文件已經(jīng)存在時,在覆蓋時會先詢問操作的進行。
-r:遞歸持續(xù)復(fù)制,用于目錄的復(fù)制行為。
-u:目標(biāo)文件與源文件有差異時才會復(fù)制。
2、rm命令作用為刪除,參數(shù):
-f:就是force的意思,忽略不存在的文件,不會出現(xiàn)警告消息。
-i:互動模式,在刪除前會詢問用戶是否操作。
-r:遞歸刪除,最常用于目錄刪除,它是一個非常危險的參數(shù)。
3、mv命令作用為移動文件:
-f:force強制的意思,如果目標(biāo)文件已經(jīng)存在,不會詢問而直接覆蓋。
-i:若目標(biāo)文件已經(jīng)存在,就會詢問是否覆蓋。
-u:若目標(biāo)文件已經(jīng)存在,且比目標(biāo)文件新,才會更新。
4、pwd命令,作用為查看”當(dāng)前工作目錄“的完整路徑。
pwd-P#顯示出實際路徑,而非使用連接(link)路徑;pwd顯示的是連接路徑。
5、rmdir命令刪除目錄:
rmdir [選項]... 目錄...
-p:遞歸刪除目錄dirname,當(dāng)子目錄刪除后其父目錄為空時,也一同被刪除。如果整個路徑被刪除或者由于某種原因保留部分路徑,則系統(tǒng)在標(biāo)準(zhǔn)輸出上顯示相應(yīng)的信息。
-v:verbose顯示指令執(zhí)行過程。
網(wǎng)頁名稱:linux仿cp命令 仿真linux
文章鏈接:http://jinyejixie.com/article18/dosgsgp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供全網(wǎng)營銷推廣、ChatGPT、靜態(tài)網(wǎng)站、搜索引擎優(yōu)化、商城網(wǎng)站、小程序開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)