ฉันจะคัดลอกโฟลเดอร์ที่ทำให้เจ้าของและสิทธิ์ยังคงอยู่ได้อย่างไร


379

ดังนั้นฉันจะสำรองโฟลเดอร์บ้านของฉันโดยคัดลอกไปยังไดรฟ์ภายนอกดังนี้

sudo cp -r /home/my_home /media/backup/my_home

root:rootกับผลที่โฟลเดอร์ทั้งหมดในไดรฟ์ภายนอกเป็นเจ้าของในขณะนี้โดย ฉันจะcpรักษาความเป็นเจ้าของและการอนุญาตจากต้นฉบับได้อย่างไร


23
ใช่เป็นเพราะฉันดีใจที่เขาถามเพราะ Google ยังเร็วกว่า 'man' :-)
Stijn Geukens

3
ฉันดีใจที่เขาถามด้วย
โอเล

5
@StijnGeukens มันไม่ใช่แม้กระทั่ง google ที่เร็วขึ้น แต่manสำหรับฉันนั้นเป็นความลับ ในกรณีนี้manที่บอกว่า-r same as --preserve=mode,ownership,timestampsฉันควรจะรู้ได้อย่างไรว่านั่นหมายถึงการอนุญาตเดิม!
Kolob Canyon

@KolobCanyon คุณหมายถึง-p
พายุ

คำตอบ:


455
sudo cp -rp /home/my_home /media/backup/my_home

จาก manpage cp:

 -p     same as --preserve=mode,ownership,timestamps

 --preserve[=ATTR_LIST]
          preserve the specified attributes (default: mode,ownership,timestamps),
          if possible additional attributes: context, links, xattr, all

129
cp -aที่ดีมากที่จะใช้ ซึ่งรวมถึงการ-rตั้งค่าสถานะแบบ ecursive แต่ทำมากกว่านั้น - มันเก็บรักษาทุกอย่างเกี่ยวกับไฟล์ แอตทริบิวต์ SELinux ลิงก์ xattr ทุกอย่าง มันเป็น "โหมดเก็บถาวร" มีเครื่องมือที่ดีกว่าสำหรับการสำรองข้อมูลมี แต่ถ้าคุณกำลังใช้สำหรับการสำรองข้อมูลที่ไม่ได้ใช้อะไรอื่นนอกจากcp cp -a
Wildcard

25
มันใช้งานได้ แต่ความอดทนเป็นสิ่งที่ดีที่นี่ คำสั่งจะตั้งค่าทุกอย่างถูกต้องเมื่อมันเสร็จสิ้น: ในขณะที่มันยังคงคัดลอกไดเรกทอรีและคุณกำลังเรียกใช้ cp เป็น root ไดเรกทอรีจะเป็นเจ้าของโดย root มันจะตั้งค่าเป็นสิทธิ์ที่ถูกต้องเมื่อมันเสร็จสิ้นกับไดเรกทอรีนี้
พอล

4
cp -aไม่ทำงานในบางระบบ: เช่น OS X ที่ (ในบางรุ่นอย่างน้อย) cp -pRหนึ่งจำเป็นต้องใช้ ในระบบ OS X ปัจจุบันของฉัน (10.10.15) cp -aดูเหมือนว่าจะได้รับเกียรติ
dubiousjim

หากฉันใช้ cp -a เพื่อคัดลอกโครงสร้างโฟลเดอร์แล้วใช้diff <(getfacl -R folder1) <(getfacl -R folder2)i sill ดูเหมือนจะได้รับรายการควบคุมการเข้าถึงที่แตกต่างกัน :(
philx_x

ทำไมคุณถึงเลือก "cp -rp" ไม่ใช่ "cp -p"
Eugene Kaurov

94

rsyncนอกจากนี้คุณยังสามารถใช้

sudo rsync -a /home/my_home/ /media/backup/my_home/

จากrsyncmanpage:

 -a, --archive
              This  is  equivalent  to  -rlptgoD.  It  is a quick way of saying you want
              recursion and want to preserve almost everything (with -H being a  notable
              omission).    The   only  exception  to  the  above  equivalence  is  when
              --files-from is specified, in which case -r is not implied.

              Note that -a does not preserve hardlinks, because finding  multiply-linked
              files is expensive.  You must separately specify -H.

ดูคำถามนี้เพื่อเปรียบเทียบระหว่างcpและrsync: https://stackoverflow.com/q/6339287/406686

สังเกตเครื่องหมายสแลช (ดู manpage สำหรับรายละเอียด)


4
+1 cp -pเป็นสิ่งที่ดี แต่ผมชอบrsyncของการส่งออกมากขึ้นโดยทั่วไปที่ผมเคยใช้นามแฝงที่จะpcp time rsync --progress -ahย่อมาจาก "คัดลอกความคืบหน้า" ในใจของฉัน และทั้งสองยอมรับ-rจึงใช้งานได้ดีสำหรับการใช้งานเครื่องทั่วไป - แต่น่าเสียดายที่ไม่ได้ใช้ร่วมกับsudoที่แสดงในคำถาม / คำตอบนี้
Izkata

15
หมายเหตุ: rsync -aไม่รักษาคุณลักษณะเพิ่มเติม ( -X) และไม่มีการ ACLs ( -A) - คำอธิบายสั้น ๆ archive mode; equals -rlptgoD (no -H,-A,-X)ว่า เช่นบริบทของ SELinux จะไม่ได้รับการดูแล-Xล่วงหน้า สำหรับกรณีการใช้งานหลายกรณีนี่เป็นสิ่งที่ดี แต่ถ้าคุณสำรองข้อมูลพาร์ติชันระบบของคุณการขาดหายไปของ -X อาจทำให้เสียได้มาก เท่าที่ฉันรู้cp -aจริง ๆ รักษาไฟล์คุณลักษณะทั้งหมด
Perseids

2
เพิ่งทดสอบสิ่งนี้ในขณะที่sudo cp -aรักษาความเป็นเจ้าของและกลุ่มไว้ให้sudo rsync -aเปลี่ยนเป็นรูท ดังนั้น @Perseids ถูกต้อง
จอห์นแฮมิลตัน

3
@JohnHamilton Under Mint ทำงานได้อย่างสมบูรณ์แบบ ... มันแค่เปลี่ยนความเป็นเจ้าของและกลุ่มในภายหลัง (ฉันไม่สามารถบอกได้ว่าเมื่อไหร่) ฉันเพิ่งคัดลอก/homeโฟลเดอร์ทั้งหมดของฉันไปด้วยrsync -aX /home /mnt/sdd/และมันก็ทำงานได้อย่างมีเสน่ห์
Olivier Pons

@JohnHamilton นั่นไม่ใช่สิ่งที่ Perseides พูดเลย
643011

60
cp -a

-aสั้นตรงไหน--archive- โดยทั่วไปมันจะคัดลอกไดเรกทอรีอย่างที่มันเป็น ไฟล์จะรักษาคุณลักษณะทั้งหมดไว้และ symlink จะไม่ถูกยกเลิกการลงทะเบียน ( -d)

จากman cp:

   -a, --archive
          same as -dR --preserve=all

21

ฉันใช้cp -pdRxซึ่งจะ-pรักษาโหมด, ความเป็นเจ้าของ & timestamps, -dรักษาลิงก์ (เพื่อให้คุณได้รับ symlink แทนเนื้อหาของไฟล์ที่คัดลอก), -Rทำซ้ำและ-xอยู่ในระบบไฟล์เดียว (มีประโยชน์จริง ๆ ถ้าคุณกำลังคัดลอก/หรือบางสิ่งบางอย่าง )

PS: -Rแทนที่จะเป็นเพียงนิสัยจากการใช้-rls -lR


2
cp -axเป็นรุ่นเดียวกันที่สั้นกว่าเล็กน้อย มันใช้งานได้ดีมาก - ขอบคุณ!
EM0

ที่จริงมีความแตกต่างระหว่างและ-r -Rตรวจสอบ man page (แม้แต่ส่วนที่ยาวเกินไปที่จะอ้างถึงที่นี่)
geckon

2
ฉันไม่คิดว่าจะมี (แม้ว่าอาจเคยมีครั้งเดียวและอาจยังคงอยู่ในบางรุ่นของ Unix) ดูman7.org/linux/man-pages/man1/cp.1.html-R, -r, --recursive copy directories recursivelyมันก็บอกว่า
StarNamer

14

cpมีตัวเลือกในการรักษาความเป็นเจ้าของไฟล์ จากหน้าคู่มือของcp:

-p    Cause cp to preserve the following attributes of each source file in the copy: modification
      time, access time, file flags, file mode, user ID, and group ID, as allowed by permissions.
      Access Control Lists (ACLs) and Extended Attributes (EAs), including resource forks, will also
      be preserved.

11

คุณสามารถทำสิ่งนี้:

tar cf - my_home | (cd /media/backup; sudo tar xf - )

tarรักษาสิทธิ์ความเป็นเจ้าของและโครงสร้างไดเรกทอรีไว้เหมือนเดิม แต่แปลงทุกอย่างให้เป็นจำนวนไบต์ คุณเรียกใช้ "subshell" (คำสั่งวงเล็บ) ที่เปลี่ยนไดเรกทอรีและจากนั้นรับtarการแปลงกลับ จำนวนไบต์จะกลายเป็นไดเรกทอรีและไฟล์ที่มีความเป็นเจ้าของและสิทธิ์ที่ถูกต้อง


7

คำตอบนั้นง่าย: cpมี-pตัวเลือกที่รักษาสิทธิ์ (นี่คือปลา)

แต่อย่างที่ Wojtek กล่าวในความคิดเห็นของเขาman cp(การอ่านคู่มืออย่างละเอียด) จะเป็นจุดเริ่มต้นที่ดี (ต้องการเรียนรู้วิธีตกปลา?)


1

คุณสามารถใช้สงวน = ทั้งหมดจากนั้นสำเนาของคุณจะเก็บแอตทริบิวต์ทั้งหมดเช่นเจ้าของกลุ่มและเวลาประทับของไฟล์ของคุณ ดังนั้นทำการสำรองข้อมูลของคุณอย่างปลอดภัยด้วยคำสั่งต่อไปนี้

cp -r --preserve=all /home/my_home /media/backup/my_home
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.