Linux & SVN: วิธีลบไฟล์ที่มีเวอร์ชันทั้งหมดยกเว้นโครงสร้างไดเร็กทอรี KEEP ให้ข้าม. svn dirs?


9

ฉันต้องการลบไฟล์ที่มีเวอร์ชันทั้งหมดออกจากที่เก็บของฉัน แต่ให้ KEEP เป็นโครงสร้างไดเรกทอรีที่มีเวอร์ชัน เห็นได้ชัดว่าฉันต้องการออกจากไดเรกทอรี. svn ทั้งหมดที่ไม่มีใครแตะต้อง

กล่าวอีกนัยหนึ่งฉันต้องการลบโครงสร้างไดเรกทอรีของสำเนาการทำงานโดยไม่ทำลายโครงสร้างไดเรกทอรีเอง

ตัวอย่างเช่นการลบไฟล์ออกจากโครงสร้างนี้:

dir/
    .svn/
        [files]
    svsubdir1/
        file1
        .svn/
            [files]
    subdir2/
        file2
        file3
        file4
        .svn/
            [files]
        subsubdir1/
            file5
            .svn/
                [files]

ควรส่งผลให้:

dir/
    .svn/
        [files]
    svsubdir1/
        .svn/
            [files]
    subdir2/
        .svn/
            [files]
        subsubdir1/
            .svn/
                [files]

ฉันกำลังมองหาfindคำสั่งบางอย่างหรือบางสิ่งบางอย่างเพื่อทำสิ่งนี้และฉันมีปัญหาในการสร้างคำสั่ง ขอบคุณสำหรับความช่วยเหลือ!


เหตุผลที่ฉันทำสิ่งนี้คือฉันมีเว็บแอปที่ได้รับการพัฒนาใน "รุ่น" แต่ไม่เคยอยู่ภายใต้การควบคุมการแก้ไขมาก่อน ฉันต้องการวางไว้ภายใต้การควบคุมการแก้ไข SVN ในขณะนี้และเพื่อความสะดวกในการอ้างอิงทางประวัติศาสตร์ ฯลฯ ฉันพยายามจำลองรุ่นสี่เวอร์ชันจากโฟลเดอร์ "สำรอง" ที่แตกต่างกันสี่โฟลเดอร์ที่มีรุ่นเก่ากว่า เมื่อลบไฟล์แล้วฉันสามารถคัดลอกไฟล์ที่ใหม่กว่าลงในลำดับชั้นเพื่อจำลองการแก้ไขที่ใหม่กว่า ไม่แน่ใจว่าทั้งหมดนั้นสมเหตุสมผลหรือไม่ :)
Brian Lacy

1
เป็นที่น่าสังเกตว่า SVN ตั้งแต่รุ่น 1.7 (ตุลาคม 2011) ไม่มีไดเรกทอรี ".svn" หลายอันอีกต่อไป แต่มีเพียงหนึ่ง. svn dir ที่ระดับบนสุด ดูsubversion.apache.org/docs/release-notes/1.7.html#wc-ng
Rich

คำตอบ:


10
find dir/ -path '*/.svn' -prune -o -type f -print

ควรพอดีกับใบเรียกเก็บเงิน (ส่วนใหญ่มาจากหน้าค้นหาสำหรับ-path) ท่อมันให้น้อยลงและตรวจสอบออก สิ่งแรกที่พบคือ (พา ธ ลงท้ายด้วย. svn และไม่หักเงินใน (พรุน) ไดเรกทอรีนี้) หรือ (ถ้าเป็นไฟล์ให้พิมพ์)

ถ้ามันดูดีเปลี่ยนเป็น

find dir/ -path '*/.svn' -prune -o -type f -exec rm {} +

รุ่น + รวมไฟล์ทั้งหมดเข้าด้วยกันในคำสั่ง rm เดียว หากคุณหวาดระแวงให้สำรองต้นไม้ ( cp -a dir/ otherdir/) ก่อน


โซลูชั่นที่สมบูรณ์แบบนั่นคือสิ่งที่ฉันต้องการ! ขอบคุณ Derf!
Brian Lacy

แทนที่ '-exec rm {} +' คุณสามารถใช้ตัวเลือก '-delete' ที่ใช้งานง่ายขึ้น
Tim Bielawa

1
@Tim ตามการค้นหา manpage -deleteความลึกอันดับแรกจึงขัดแย้งกับ-pruneเพราะไฟล์ภายในโฟลเดอร์จะถูกตรวจสอบก่อนที่จะตรวจสอบตัวโฟลเดอร์เอง โซลูชันอื่น ๆ (ใช้-not -path ...แทน-path ... -pruneสามารถใช้ตัวเลือก -delete
DerfK

รับได้สวย!
Tim Bielawa

ฉันใช้เคล็ดลับนี้ (หรือคล้ายกัน) หลายครั้งในช่วงหลายปีที่ผ่านมาในหลากหลายสถานการณ์ ขอบคุณอีกครั้ง @DerfK :)
Brian Lacy

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