copy ไฟล์ให้เหมือนเดิม

ในบทความนี้ขอแสดงตัวอย่างและเปรียบเทียบผลลัพธ์การใช้คำสั่ง 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)

Leave a Reply