ในบทความนี้ขอแสดงตัวอย่างและเปรียบเทียบผลลัพธ์การใช้คำสั่ง cp ด้วยออปชั่นต่างๆ ว่าข้อมูลของไฟล์ (file perrmission, owner, group, timestamps, attributes) ว่าแตกต่างกันอย่างไร
หมายเหตุ ตัวอย่างในบทความนี้ทดสอบบน Fedora 11
สร้างไฟล์ทดสอบด้วย user1
[user1@fc11-64a tmp]$ echo "Hello World, this is test file." > user1-file.0
[user1@fc11-64a tmp]$ ls -l total 4 -rw-rw-r-- 1 user1 user1 32 2009-10-03 17:03 user1-file.0
คำสั่ง cp ไม่มีออปชั่น
ทดสอบด้วย root เพื่อ copy ไฟล์ โดยไม่มีการระบุออปชั่น
[root@fc11-64a tmp]# date Sat Oct 3 17:06:52 ICT 2009
[root@fc11-64a tmp]# cp user1-file.0 user1-file.1
[root@fc11-64a tmp]# ls -l -rw-rw-r-- 1 user1 user1 32 2009-10-03 17:03 user1-file.0 -rw-r--r-- 1 root root 32 2009-10-03 17:06 user1-file.1
ไฟล์ที่ copy ได้มา จะมี permission, owner, group, timestamp ไม่ตรงกับไฟล์ต้นฉบับ เพราะดีฟอลต์ คำสั่ง cp จะไม่ preserve ข้อมูลของไฟล์เลย
cp -p เก็บข้อมูลของไฟล์
หากต้องการ preserve ข้อมูลของไฟล์ด้วย ต้องระบุออปชั่น ‘-p’
คำอธิบาย ออปชั่น ‘-p’ จาก man cp(1)
-p same as --preserve=mode,ownership,timestamps
ทดสอบ cp ด้วยออปชั่น ‘-p’
[root@fc11-64a tmp]# date Sat Oct 3 17:08:01 ICT 2009
[root@fc11-64a tmp]# cp -p user1-file.0 user1-file.2
[root@fc11-64a tmp]# ls -l -rw-rw-r-- 1 user1 user1 32 2009-10-03 17:03 user1-file.0 -rw-r--r-- 1 root root 32 2009-10-03 17:06 user1-file.1 -rw-rw-r-- 1 user1 user1 32 2009-10-03 17:03 user1-file.2
หมายเหตุ หากใช้ user อื่น ที่ไม่ใช่ root เช่น user2 จะไม่สามารถคงข้อมูล owner, group ของไฟล์ได้
[user2@fc11-64a tmp]$ cp -p user1-file.0 user1-file.3
[user2@fc11-64a tmp]$ ls -l
-rw-rw-r-- 1 user1 user1 32 2009-10-03 17:03 user1-file.0
-rw-rw-r-- 1 user2 user2 32 2009-10-03 17:03 user1-file.3
ทดสอบ preserve ข้อมูล ACL
ใช้ user1 คอนฟิก ACL เพิ่มเติมในไฟล์
[user1@fc11-64a tmp]$ getfacl user1-file.0 # file: user1-file.0 # owner: user1 # group: user1 user::rw- group::rw- other::r--
[user1@fc11-64a tmp]$ setfacl -m user:user2:rwx user1-file.0
[user1@fc11-64a tmp]$ getfacl user1-file.0 # file: user1-file.0 # owner: user1 # group: user1 user::rw- user:user2:rwx group::rw- mask::rwx other::r--
การใช้ออปชั่น ‘-p’ สามารถ preserve File ACL ที่คอนฟิกไว้ได้ด้วย
[root@fc11-64a tmp]# cp -p user1-file.0 user1-file.3 [root@fc11-64a tmp]# ls -l -rw-rwxr--+ 1 user1 user1 32 2009-10-03 17:03 user1-file.0 -rw-rwxr--+ 1 user1 user1 32 2009-10-03 17:03 user1-file.3
[root@fc11-64a tmp]# getfacl user1-file.3
# file: user1-file.3
# owner: user1
# group: user1
user::rw-
user:user2:rwx
group::rw-
mask::rwx
other::r--
cp -v แสดงไฟล์ที่กำลัง copy
หากต้องการดูไฟล์ที่กำลัง copy อยู่ สามารถใช้ ออปชั่น ‘-v’
คำอธิบาย ออปชั่น ‘-p’ จาก man cp(1)
-v, --verbose explain what is being done
[root@fc11-64a tmp]# cp -pv user1-file.0 user1-file.4 `user1-file.0' -> `user1-file.4'
soft link file
ใช้ user1 สร้าง soft link ชื่อ user1-link.0 เพื่อ link ไฟล์ไปยัง user1-file.0
[user1@fc11-64a tmp]$ ln -s user1-file.0 user1-link.0 [user1@fc11-64a tmp]$ ls -l -rw-rwxr--+ 1 user1 user1 32 2009-10-03 17:03 user1-file.0 lrwxrwxrwx 1 user1 user1 12 2009-10-03 17:15 user1-link.0 -> user1-file.0
ใช้คำสั่ง cp -p เพื่อ copy ไฟล์ soft link
[root@fc11-64a tmp]# cp -p user1-link.0 user1-link.1
[root@fc11-64a tmp]# ls -l
-rw-rwxr--+ 1 user1 user1 32 2009-10-03 17:03 user1-file.0
lrwxrwxrwx 1 user1 user1 12 2009-10-03 17:15 user1-link.0 -> user1-file.0
-rw-rwxr--+ 1 user1 user1 32 2009-10-03 17:03 user1-link.1
ผลลัพธ์กลับเป็นการ copy ไฟล์ต้นฉบับ user1-file.0 ไม่ใช่ link file
cp -d เก็บสถานะ link file
หากต้องการ copy ไฟล์แล้วยังคงสถานะ link file ไว้ ต้องใช้ ออปชั่น ‘-d’
คำอธิบาย ออปชั่น ‘-p’ จาก man cp(1)
-d same as --no-dereference --preserve=links
[root@fc11-64a tmp]# cp -pd user1-link.0 user1-link.2
[root@fc11-64a tmp]# ls -l total 8 -rw-rwxr--+ 1 user1 user1 32 2009-10-03 17:03 user1-file.0 lrwxrwxrwx 1 user1 user1 12 2009-10-03 17:15 user1-link.0 -> user1-file.0 -rw-rwxr--+ 1 user1 user1 32 2009-10-03 17:03 user1-link.1 lrwxrwxrwx 1 user1 user1 12 2009-10-03 17:18 user1-link.2 -> user1-file.0
copy ทั้งไดเร็คทอรี
ใช้ user1 สร้างไดเร็คทอรี และไฟล์ย่อยๆ ข้างใน
[user1@fc11-64a tmp]$ mkdir user1-dir.0 [user1@fc11-64a tmp]$ touch user1-dir.0/sub-file1.txt [user1@fc11-64a tmp]$ touch user1-dir.0/sub-file2.txt [user1@fc11-64a tmp]$ touch user1-dir.0/sub-file3.txt [user1@fc11-64a tmp]$ touch user1-dir.0/sub-file4.txt [user1@fc11-64a tmp]$ ls -l total 0 drwxrwxr-x 2 user1 user1 86 2009-10-03 17:24 user1-dir.0 [user1@fc11-64a tmp]$ ls -l user1-dir.0/ total 0 -rw-rw-r-- 1 user1 user1 0 2009-10-03 17:24 sub-file1.txt -rw-rw-r-- 1 user1 user1 0 2009-10-03 17:24 sub-file2.txt -rw-rw-r-- 1 user1 user1 0 2009-10-03 17:24 sub-file3.txt -rw-rw-r-- 1 user1 user1 0 2009-10-03 17:24 sub-file4.txt
ทดลองใช้ root เพื่อ copy ไฟล์ทั้งไดเร็คทอรี
[root@fc11-64a tmp]# cp -pd user1-dir.0/ user1-dir.1 cp: omitting directory `user1-dir.0/'
[root@fc11-64a tmp]# ls -l total 0 drwxrwxr-x 2 user1 user1 86 2009-10-03 17:24 user1-dir.0
ออปชั่นแค่นี้ ไม่สามารถ copy ไดเร็คทอรี ได้
cp -R ทั้งไดเร็คทอรี
หากต้องการ copy ทั้งไดเร็คทอรี ต้องใช้ออปชั่น ‘-R’ หรือ ‘-r’
คำอธิบาย ออปชั่น ‘-p’ จาก man cp(1)
-R, -r, --recursive copy directories recursively
[root@fc11-64a tmp]# cp -pvdR user1-dir.0/ user1-dir.1 `user1-dir.0/' -> `user1-dir.1' `user1-dir.0/sub-file1.txt' -> `user1-dir.1/sub-file1.txt' `user1-dir.0/sub-file2.txt' -> `user1-dir.1/sub-file2.txt' `user1-dir.0/sub-file3.txt' -> `user1-dir.1/sub-file3.txt' `user1-dir.0/sub-file4.txt' -> `user1-dir.1/sub-file4.txt'
ตรวจสอบไดเร็คทอรี และไฟล์ที่อยู่ข้างใน
[root@fc11-64a tmp]# ls -l total 0 drwxrwxr-x 2 user1 user1 86 2009-10-03 17:24 user1-dir.0 drwxrwxr-x 2 user1 user1 86 2009-10-03 17:24 user1-dir.1 [root@fc11-64a tmp]# ls -l user1-dir.1/ total 0 -rw-rw-r-- 1 user1 user1 0 2009-10-03 17:24 sub-file1.txt -rw-rw-r-- 1 user1 user1 0 2009-10-03 17:24 sub-file2.txt -rw-rw-r-- 1 user1 user1 0 2009-10-03 17:24 sub-file3.txt -rw-rw-r-- 1 user1 user1 0 2009-10-03 17:24 sub-file4.txt
cp -a ออปชั่นเดียวทำทุกอย่าง
ออปชั่นที่ยกตัวอย่างข้างบนมาทั้งหมด (ยกเว้น -v) สามารถเปลี่ยนเป็นออปชั่นเดียวได้คือ ‘-a’ เพื่อการ copy ไฟล์แล้วคงข้อมูลของไฟล์ไว้ทั้งหมด รวมทั้ง copy ไดเร็คทอรี ไฟล์ย่อยๆ ได้ทั้งหมด
คำอธิบาย ออปชั่น ‘-p’ จาก man cp(1)
-a, --archive same as -dR --preserve=all
[root@fc11-64a tmp]# cp -av user1-dir.0/ user1-dir.2 `user1-dir.0/' -> `user1-dir.2' `user1-dir.0/sub-file1.txt' -> `user1-dir.2/sub-file1.txt' `user1-dir.0/sub-file2.txt' -> `user1-dir.2/sub-file2.txt' `user1-dir.0/sub-file3.txt' -> `user1-dir.2/sub-file3.txt' `user1-dir.0/sub-file4.txt' -> `user1-dir.2/sub-file4.txt'
[root@fc11-64a tmp]# ls -l
total 0
drwxrwxr-x 2 user1 user1 86 2009-10-03 17:24 user1-dir.0
drwxrwxr-x 2 user1 user1 86 2009-10-03 17:24 user1-dir.1
drwxrwxr-x 2 user1 user1 86 2009-10-03 17:24 user1-dir.2
[root@fc11-64a tmp]# ls -l user1-dir.2/
total 0
-rw-rw-r-- 1 user1 user1 0 2009-10-03 17:24 sub-file1.txt
-rw-rw-r-- 1 user1 user1 0 2009-10-03 17:24 sub-file2.txt
-rw-rw-r-- 1 user1 user1 0 2009-10-03 17:24 sub-file3.txt
-rw-rw-r-- 1 user1 user1 0 2009-10-03 17:24 sub-file4.txt
ข้อมูลอ้างอิง
- man cp(1)