วิธีลบไดเรกทอรี. svn ทั้งหมดออกจากไดเรกทอรีแอปพลิเคชันของฉัน


192

หนึ่งในภารกิจของเครื่องมือส่งออกที่ฉันมีในแอปพลิเคชันของฉันคือการล้าง.svnไดเรกทอรีทั้งหมดจากแผนผังไดเรกทอรีแอปพลิเคชันของฉัน ฉันกำลังมองหาคำสั่งแบบเรียกซ้ำในเชลล์ลินุกซ์ที่จะสำรวจทรีทั้งต้นและลบ.svnไฟล์

ฉันไม่ได้ใช้การส่งออกเนื่องจากสคริปต์นี้จะใช้กับชื่อไฟล์ / ไดเรกทอรีอื่นซึ่งไม่เกี่ยวข้องกับ SVN ฉันลองทำสิ่งที่ชอบ:

find . -name .svn | rm -fr

มันไม่ทำงาน ...


3
คำสั่งของคุณควรใช้งานได้หากคุณใช้ 'xargs rm -rf'
Peter van der Heijden

1
คุณอาจต้องการแก้ไขคำสั่งลบ "rm -rfi" เพียงเพื่อให้แน่ใจว่าคุณแน่ใจว่าคุณต้องการลบไดเรกทอรี
bedwyr

อย่าใช้ xargs แม้ว่า .. คุณจะมีปัญหากับไดเรกทอรีที่มีช่องว่าง ฯลฯ ใช้ค้นหาตามที่อธิบายไว้ด้านล่าง
John Hunt

คำตอบ:


438

ลองสิ่งนี้:

find . -name .svn -exec rm -rf '{}' \;

ก่อนเรียกใช้คำสั่งเช่นนั้นฉันมักจะเรียกใช้ก่อนนี้:

find . -name .svn -exec ls '{}' \;

43
คุณอาจต้องใส่ {} ลงในfind . -name .svn -exec rm -rf '{}' \;
เครื่องหมาย

38
การทดสอบนี้ใช้งานได้ดีกว่าในทุบตีของฉัน:find . -name .svn -exec echo {} \;
Fedir RYKHTIK

6
การรัน echo / ls ก่อนคือการสัมผัส 'โปร' สำหรับคำตอบนี้ คนโง่ ๆ สามารถทำลายระบบได้
John Hunt

6
สิ่งที่ไม่{} \;ทำอะไร?
Jon Mitten

3
โดยการเรียกใช้คำสั่งที่สองรวมทั้งlsฉันได้รับentries prop-base props text-base tmpการส่งออก ...
Rasoul

51

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

xargs รับอินพุตโดยปกติคั่นด้วยบรรทัดใหม่และวางลงในบรรทัดคำสั่งดังนั้นการเพิ่ม xargs ทำให้สิ่งที่คุณใช้งาน:

find . -name .svn | xargs rm -fr

xargsฉลาดพอที่จะส่งผ่านการโต้แย้งได้มากrmเท่าที่จะยอมรับได้ ดังนั้นหากคุณมีไฟล์เป็นล้านไฟล์มันอาจรันrm1,000,000 / 65,000 ครั้ง (หากเชลล์ของคุณสามารถยอมรับอาร์กิวเมนต์ 65,002 บนบรรทัดคำสั่ง {65k ไฟล์ + 1 สำหรับ rm + 1 สำหรับ -fr})

เมื่อบุคคลมีความเชี่ยวชาญชี้ให้เห็นต่อไปนี้ยังทำงาน:

find . -name .svn -exec rm -rf {} \;
find . -depth -name .svn -exec rm -fr {} \;
find . -type d -name .svn -print0|xargs -0 rm -rf

สอง-execรูปแบบแรกทั้งสองเรียกrmสำหรับแต่ละโฟลเดอร์ที่ถูกลบดังนั้นหากคุณมี 1,000,000 โฟลเดอร์rmจะถูกเรียก 1,000,000 ครั้ง แน่นอนว่ามันน้อยกว่าอุดมคติ การนำไปใช้ใหม่จะrmช่วยให้คุณสามารถสรุปคำสั่งด้วยการ+ระบุว่าrmจะยอมรับข้อโต้แย้งได้มากที่สุด:

find . -name .svn -exec rm -rf {} +

เวอร์ชัน find / xargs ล่าสุดใช้ print0 ซึ่งทำให้ find create output ที่ใช้\0เป็น terminator แทนที่จะขึ้นบรรทัดใหม่ เนื่องจากระบบ POSIX อนุญาตให้ใช้อักขระใดก็ได้ แต่\0ในชื่อไฟล์นี่เป็นวิธีที่ปลอดภัยที่สุดอย่างแท้จริงเพื่อให้แน่ใจว่าอาร์กิวเมนต์จะถูกส่งผ่านอย่างถูกต้องไปยังrmแอปพลิเคชันที่ถูกเรียกใช้

นอกจากนี้ยังมีสิ่ง-execdirที่จะดำเนินการrmจากไดเรกทอรีที่พบไฟล์มากกว่าที่ไดเรกทอรีฐานและ-depthที่จะเริ่มลึกก่อน


31

ไม่จำเป็นต้องมีท่อ xargs, exec หรืออะไร:

find . -name .svn -delete

แก้ไข:เพียงล้อเล่น-deleteโทรออกอย่างเห็นได้ชัดunlinkat()ภายใต้ประทุนดังนั้นจึงมีลักษณะเช่นunlinkหรือrmdirและจะปฏิเสธที่จะทำงานในไดเรกทอรีที่มีไฟล์


54
ปัญหาหนึ่ง-deleteจะไม่แตะไดเรกทอรีหากมีไฟล์อยู่
Xeoncross

2
ไม่มี-forceแฟล็กหรือเรียกซ้ำสำหรับเพร-deleteดิเคตดังนั้นคำตอบนี้จึงไม่มีประโยชน์ ดังนั้นก็กลับไป|xargs rm -rfซึ่งเป็นที่น่าเกลียดน้อยที่จะพิมพ์แล้วกับตัวยึดที่น่าเกลียดและอัฒภาค:-exec -exec rm -rf '{}' \;
Tomasz Gandor

13

มีคำตอบมากมายสำหรับการลบ. svn-directory แต่ฉันต้องการเพิ่มที่คุณสามารถหลีกเลี่ยงไดเรกทอรีเหล่านี้ตั้งแต่ต้นถ้าคุณทำการส่งออกแทนการชำระเงิน:

svn export <url>

+1, ไม่จำเป็นต้องทำซ้ำสิ่งนี้เมื่อมันมีอยู่แล้วใน svn
Powerlord

1
ปัญหาเดียวที่ฉันเห็นด้วยวิธีนี้คือถ้าคุณต้องการเก็บไฟล์ที่ไม่มีเวอร์ชันในการส่งออก จาก svn docs "การเปลี่ยนแปลงในระบบทั้งหมดจะถูกเก็บไว้ แต่ไฟล์ที่ไม่อยู่ภายใต้การควบคุมเวอร์ชันจะไม่ถูกคัดลอก"
raidfive

@raidfive: โดยปกติแล้วฉันต้องการให้ไฟล์ที่เกี่ยวข้องทั้งหมดอยู่ภายใต้การควบคุมเวอร์ชันแม้แต่ใช้ไลบรารีเพื่อให้โครงการทำงานนอกกรอบ ไฟล์ Unversioned ในการตั้งค่านี้เป็นไบนารีที่รวบรวมไว้ซึ่งถูกสร้างใหม่โดยเป้าหมายใน buildfile แต่คุณพูดถูกถ้าโครงการของคุณอาศัยไฟล์ที่ไม่ได้อยู่ในการควบคุมเวอร์ชันการส่งออกจะไม่ทำงาน
Mnementh

แต่ ... ฉันต้องการคำตอบที่กว้างกว่าเดิม . svn เป็นเพียงตัวอย่างที่พบบ่อยที่สุดฉันสังเกตเห็นว่าในคำถาม
Itay Moav -Malimovka

12

ถ้าคุณไม่ชอบที่จะเห็นมาก

find: `./.svn': No such file or directory

คำเตือนแล้วใช้-depthสวิตช์:

find . -depth -name .svn -exec rm -fr {} \;

10

ใน Windows คุณสามารถใช้สคริปต์รีจิสตรีต่อไปนี้เพื่อเพิ่ม "ลบโฟลเดอร์ SVN" ในเมนูบริบทคลิกขวาของคุณ เรียกใช้ในไดเรกทอรีใด ๆ ที่มีไฟล์ที่น่ารำคาญ

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell\DeleteSVN]
@="Delete SVN Folders"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell\DeleteSVN\command]
@="cmd.exe /c \"TITLE Removing SVN Folders in %1 && COLOR 9A && FOR /r \"%1\" %%f IN (.svn) DO RD /s /q \"%%f\" \""

เคล็ดลับเรียบร้อย ไม่เป็นประโยชน์สำหรับ OP แต่เป็น +1 เพราะฉันประทับใจ!
rrhartjr

นี่มันเจ๋งมาก. ขอบคุณ ฉันรู้ว่ามันเก่ามาก แต่ไม่ว่าอะไรก็ตาม ฉันรักมันต่อไป
Anthony

9

คุณเกือบจะได้มัน หากคุณต้องการส่งออกคำสั่งเป็นพารามิเตอร์ไปยังอีกรายการหนึ่งคุณจะต้องใช้ xargs การเพิ่ม-print0ทำให้แน่ใจว่าสคริปต์สามารถจัดการพา ธ ด้วยช่องว่าง:

find . -type d -name .svn -print0|xargs -0 rm -rf

2
สำหรับ reson บางสิ่งที่ทำงานได้ในที่สุดก็พบว่า -name .svn | xargs rm -rf รุ่นของคุณให้ทิศทางฉันขอบคุณ
Itay Moav -Malimovka


4

เป็นปัญหาสำคัญเมื่อคุณต้องการใช้เชลล์เพื่อลบโฟลเดอร์. svn คุณต้องการอาร์กิวเมนต์-depthเพื่อป้องกันคำสั่ง find เข้าสู่ไดเรกทอรีที่เพิ่งถูกลบและแสดงข้อความผิดพลาดเช่น

"find: ./.svn: No such file or directory"

เป็นผลให้คุณสามารถใช้คำสั่งค้นหาเช่นด้านล่าง:

cd [dir_to_delete_svn_folders]
find . -depth -name .svn -exec rm -fr {} \;

นี่คือสิ่งที่ฉันกำลังมองหาและควรเป็นคำตอบที่ถูกต้อง
luckytaxi

3

ลองสิ่งนี้:

find . -name .svn -exec rm -v {} \;

อ่านข้อมูลเพิ่มเติมเกี่ยวกับการหาคำสั่งที่developerWorks


2

อีกทางเลือกหนึ่งถ้าคุณต้องการส่งออกสำเนาโดยไม่แก้ไขสำเนาทำงานคุณสามารถใช้ rsync:

rsync -a --exclude .svn path/to/working/copy path/to/export

1
หรือใช้ svn export / path / to / repository ซึ่งทำสิ่งเดียวกัน
Kaleb Pederson

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