จะสร้างไฟล์ cp และสร้างไดเรกทอรีได้อย่างไรถ้าไม่มีอยู่?


15

ฉันต้องการคัดลอกไฟล์ที่แก้ไขในที่เก็บ svn ไปยังไดเรกทอรีอื่นในขณะที่ยังคงโครงสร้างไดเรกทอรีของพวกเขา

หลังจากอ่าน manpage awk และ xargs ฉันพบวิธีเปลี่ยนชื่อไฟล์ดังนี้:

$ svn status -q | awk '{ print $2 }' | xargs -d \\n -I '{}' cp '{}' /tmp/xen/

แต่ปัญหาคือว่าด้วยวิธีนี้โครงสร้างไดเรกทอรีจะไม่ถูกเก็บรักษาไว้ฉันต้องการคัดลอกไฟล์ดังนี้:

./common/superp.c -> /tmp/xen/common/superp.c
./common/m2mgr.c -> /tmp/xen/common/m2mgr.c
./common/page_alloc.c -> /tmp/xen/common/page_alloc.c
./arch/x86/mm.c -> /tmp/xen/arch/x86/mm.c
./arch/x86/mm/shadow/private.h -> /tmp/xen/arch/x86/mm/shadow/private.h

ฉันพยายามเปลี่ยนคำสั่งcp เป็น cp '{}' / tmp / xen / '{}'แต่มันบอกว่าไม่มีไฟล์หรือไดเรคทอรีดังกล่าว มีวิธีการทำสำเนาไฟล์ cp และสร้างไดเรกทอรีถ้าจำเป็นหรือไม่ และโปรดชี้ให้เห็นว่าห่วงโซ่คำสั่งนี้สามารถลดความซับซ้อนได้หรือไม่ :-)

ขอบคุณสำหรับคำตอบทั้งหมดของคุณ เนื่องจากไดเรกทอรีมีขนาดใหญ่ฉันไม่ต้องการคัดลอกทั้งไดเรกทอรีโดยใช้ cp -R หรือ rsync คำแนะนำของ CK ในการใช้ท่อน้ำมันดินค่อนข้างมีประโยชน์

svn status -q | awk '{ print $2 }' | xargs tar cf -  | (cd /tmp/xen/; tar xvf -)

คำตอบ:


12

คู่ของความคิดด่วน:

  • เพิ่มใน mkdir -p $ (dirname FILE)
  • คุณสามารถใช้ท่อ tar เพื่อเรียงทั้งหมดออกได้ไหม

แก้ไข

 tar -cf archive.tar  `svn status -q | awk '{print $2}'`

ควรสร้างไฟล์เก็บถาวรของไฟล์ที่ถูกแก้ไข แล้ว:

  tar -xf archive.tar -C /tmp/xen

ควรวางไว้ในตำแหน่งที่คุณต้องการ หากจำเป็นต้องอยู่ในขั้นตอนเดียวก็เป็นไปได้เช่นกัน


4

rsync ทำให้ง่ายสวยมันเป็นเครื่องมือที่ฉันมักใช้สำหรับการคัดลอกโครงสร้างไดเรกทอรีทั้งหมด:

rsync -av /home/source/svn/repo /home/dest/svn/

สิ่งนี้จะสร้างไดเรกทอรี repo และเนื้อหาทั้งหมดในไดเรกทอรี / home / dest / svn ดังนั้นคุณจะมี / home / dest / svn / repo / ...

ตัวอย่างเช่นคุณ:

rsync -rv ./ /tmp/xen/

- จะรักษาเวลาประทับไว้และเรียกซ้ำในสิ่งอื่น 'man rsync'

อัปเดตหลังจากทราบว่าฉันอ่านคำถามผิด:

ในการเลียนแบบโครงสร้างไดเรกทอรี (ทางเลือก tar):

rsync -av --include='*/' --exclude='*' source destination

จากนั้นให้คัดลอกไฟล์ก่อนที่จะพูดเมื่อ 20 นาทีก่อน:

find . -type f -mmin -20 -print0 | xargs -0 cp --target-directory /mydestdir/

นั่นเป็นสิ่งที่ชัดเจน แต่จะซิงค์ทุกอย่างไม่ใช่เฉพาะไฟล์ที่ถูกดัดแปลงใช่ไหม
CK

อ๊ะพลาดไปแล้ว
Kyle Brandt

2

นี่คือหนึ่งซับสำหรับการอ้างอิง:

svn status -q | awk '{print $2}' | xargs tar -c | tar -xC /tmp/xen

และในภาษาอังกฤษ:

  • รับรายการไฟล์ที่สนใจด้วยsvn status -qซึ่งจะถูกส่งไปยัง ...
  • awk ซึ่งแยกคอลัมน์ด้วย filepaths: awk '{print $2}'
  • xargs ใช้เพื่อให้รายการของไฟล์เป็น tar ซึ่งจะส่ง tarball ของไฟล์ไปยัง stdout: xargs tar -c
  • ซึ่งจะแตกไฟล์ใหม่ ( -x) ทันทีในไดเรกทอรีเป้าหมาย ( -C path):tar -xC /tmp/xen

1

ใช้ "dirname" เพื่อแยกพา ธ "mkdir -p" เพื่อสร้าง:

xargs -d \\n -l '{}' mkdir -p \`dirname '{}'\` && cp '{}' /tmp/xen/

1

rsync -a ไม่ได้สร้างไดเรกทอรีใหม่ที่ลึกกว่าในเชิงลึก 1 ดังนั้น rsync เป็นเพียงบางส่วนของการแก้ปัญหาและตัวอย่างเช่นไม่เหมาะสำหรับฉัน (ฉัน googled เพื่อหาคำตอบวิธีการ rsync ไดเรกทอรีไปยังลำดับชั้นระยะไกลบางเมื่อขาดหลายไดเรกทอรีกลาง )

แก้ไข: ฉันหมายถึงฉันมีแหล่งที่มา dir: /home/user/projects/homework/1/1.1/ และฉันต้องการที่จะซิงค์กับระยะไกล: /home/user/projects/homework/1/1.1/ ... แต่ปลายทาง ยังไม่มีไดเรกทอรี / home / ผู้ใช้ / โครงการ / การบ้าน ... และฉันไม่ต้องการถ่ายโอนไดเรกทอรีย่อยอื่น ๆ ในเครื่องต้นทางซึ่งอยู่ใน / home / ผู้ใช้ / โครงการ /

แก้ไข 2: พบวิธีด้วยตัวเลือก rsync - สัมพันธ์: ตัวอย่างข้างต้นจะเป็นดังนี้:

cd / home / projects /; rsync -aR ทำการบ้าน / 1 / 1.1 ผู้ใช้ @ ระยะไกล: / home / ผู้ใช้ / โครงการ /


0

ฉันขอแนะนำต่อไปนี้:

  • คัดลอกทุกอย่าง
  • ค้นหาไฟล์ที่ไม่ได้แก้ไขและลบไฟล์เหล่านั้นทิ้งไฟล์ที่ถูกแก้ไขไว้ในที่ของมัน

โดยวิธีการ cp กับธง R คัดลอกไฟล์ / โฟลเดอร์ซ้ำ

cp -R

0
  • สร้างโครงสร้างไดเรกทอรีเป็น/tmp/f2ไฟล์ใน/tmp/f

    $ cd /tmp/f/
    $ find . -type f -exec dirname {} \; | uniq | xargs -I {} mkdir /tmp/f2/{} -p
    
  • คัดลอกไฟล์ไปยังปลายทางใหม่ /tmp/f2/

    $ cd /tmp/f
    $ find . -type f -exec cp  {}  /tmp/f2/{} -aPv \;
    
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.