मेरे आवेदन निर्देशिका से सभी .svn निर्देशिकाओं को कैसे निकालें


192

एक निर्यात उपकरण के मिशन में से एक जो मेरे पास मेरे आवेदन में है, वह है .svnमेरे आवेदन निर्देशिका पेड़ से सभी निर्देशिकाओं को साफ करना । मैं लिनक्स शेल में एक पुनरावर्ती कमांड की तलाश कर रहा हूं जो पूरे पेड़ को पीछे छोड़ देगा और .svnफाइलों को हटा देगा ।

मैं निर्यात का उपयोग नहीं कर रहा हूं, क्योंकि यह स्क्रिप्ट कुछ अन्य फ़ाइल / निर्देशिका नामों के लिए उपयोग की जाएगी जो एसवीएन से संबंधित नहीं हैं। मैंने कुछ इस तरह की कोशिश की:

find . -name .svn | rm -fr

यह काम नहीं किया ...


3
यदि आप 'xargs rm
-rf

1
आप केवल यह सुनिश्चित करने के लिए डिलीट कमांड "rm -rfi" को संशोधित करना चाहते हैं कि आप सकारात्मक हैं जो आप निर्देशिकाओं को हटाना चाहते हैं।
शयनकक्ष

हालांकि xargs का उपयोग न करें .. आपको उन निर्देशिकाओं से परेशानी होगी जिनके पास स्थान आदि हैं। नीचे वर्णित अनुसार उपयोग करें।
जॉन हंट

जवाबों:


438

इसे इस्तेमाल करे:

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

इस तरह एक कमांड चलाने से पहले, मैं अक्सर इसे पहले चलाना पसंद करता हूं:

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

43
यदि निर्देशिकाओं में स्थान या ऐसे पात्र हो सकते हैं तो आपको {} एकल उद्धरण में डालने की आवश्यकता हो सकती है: find . -name .svn -exec rm -rf '{}' \;
mtoloo

38
यह परीक्षण मेरे बाश में बेहतर काम करता है:find . -name .svn -exec echo {} \;
फेडिर RYKHTIK

6
सबसे पहले इको / एलएस चलाना इस उत्तर के लिए 'प्रो' स्पर्श है। कोई भी मूर्ख किसी व्यवस्था को मिटा सकता है।
जॉन हंट

6
क्या करता {} \;है?
जॉन मटन

3
सहित दूसरी कमांड चलाने से ls, मुझे entries prop-base props text-base tmpआउटपुट मिलता है ...
रसूल

51

आपने जो लिखा है, वह न्यूलाइन से अलग फाइल नामों (और रास्तों) की एक सूची भेजता है rm, लेकिन आरएम को यह नहीं पता है कि उस इनपुट का क्या करना है। यह केवल कमांड लाइन मापदंडों की अपेक्षा कर रहा है।

xargs इनपुट लेता है, आमतौर पर न्यूलाइन द्वारा अलग किया जाता है, और उन्हें कमांड लाइन पर रखता है, इसलिए xargs को जोड़ने से आपके पास काम होता है:

find . -name .svn | xargs rm -fr

xargsपर्याप्त बुद्धिमान है कि यह केवल उतने ही तर्कों को पारित करेगा जितना कि इसे rmस्वीकार कर सकते हैं। इस प्रकार, यदि आपके पास एक लाख फाइलें हैं, तो वह rm1,000,000 / 65,000 बार चल सकती है (यदि आपका शेल कमांड लाइन पर 65,002 तर्क स्वीकार कर सकता है {65k फाइलें + 1 rm + 1 for -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 {} +

अंतिम खोज / xargs संस्करण Print0 का उपयोग करता है, जो \0एक आउटपुट उत्पन्न करता है जो एक नई रेखा के बजाय एक टर्मिनेटर के रूप में उपयोग करता है । चूंकि POSIX सिस्टम किसी भी वर्ण को अनुमति देता है \0, लेकिन फ़ाइल नाम में, यह वास्तव में यह सुनिश्चित करने का सबसे सुरक्षित तरीका है कि तर्कों को सही ढंग से पारित किया जाता है rmया एप्लिकेशन निष्पादित किया जा रहा है।

इसके अलावा, वहाँ एक है -execdirजो rmउस निर्देशिका से निष्पादित करेगा जिसमें फ़ाइल को आधार निर्देशिका के बजाय पाया गया था और जो -depthपहले गहराई शुरू करेगी।


31

पाइप, xargs, निष्पादन, या कुछ भी करने की आवश्यकता नहीं है:

find . -name .svn -delete

संपादित करें: बस मजाक कर रहा है, जाहिर है हुड के तहत -deleteकॉल unlinkat()करता है, इसलिए यह व्यवहार करता है unlinkया rmdirफ़ाइलों से युक्त निर्देशिकाओं पर काम करने से इंकार कर देगा।


54
एक समस्या, -deleteएक निर्देशिका को स्पर्श नहीं करेगा यदि इसमें फाइलें हैं।
Xeoncross

2
विधेय के -forceलिए कोई या पुनरावर्ती ध्वज नहीं -deleteहै, इसलिए यह उत्तर बेकार है। इस प्रकार, यह वापस आ गया है |xargs rm -rf, जो -execउसके बदसूरत प्लेसहोल्डर्स और अर्धविराम के साथ टाइप करने के लिए कम बदसूरत है -exec rm -rf '{}' \;:।
टॉमस गैंडर

13

.Svn-निर्देशिका को हटाने के लिए पहले से ही कई उत्तर दिए गए हैं। लेकिन मैं यह जोड़ना चाहता हूं, कि आप इन निर्देशिकाओं को शुरू से टाल सकते हैं, यदि आप चेकआउट के बजाय निर्यात करते हैं:

svn export <url>

जब इसे पहले से ही svn में बनाया गया है तो +1, इसे फिर से करने की कोई आवश्यकता नहीं है।
पॉवरलॉर्ड

1
केवल इस मुद्दे को मैं इस दृष्टिकोण के साथ देख रहा हूं यदि आप निर्यात में अटूट फ़ाइलों को बनाए रखना चाहते हैं। Svn डॉक्स से, "सभी स्थानीय परिवर्तनों को संरक्षित किया जाएगा, लेकिन संस्करण नियंत्रण में नहीं आने वाली फ़ाइलों की प्रतिलिपि नहीं बनाई जाएगी।"
छापे में

@ भयभीत: आमतौर पर मैं संस्करण-नियंत्रण के तहत सभी प्रासंगिक फाइलें रखना पसंद करता हूं, यहां तक ​​कि पुस्तकालयों का भी उपयोग किया जाता है, ताकि परियोजना बॉक्स से बाहर काम करे। इस सेटअप में बिना पड़ी फाइलें संकलित बायनेरिज़ हैं, जो बिल्डफ़ाइल में एक लक्ष्य द्वारा रीमेक की जाती हैं। लेकिन आप सही हैं, यदि आपकी परियोजना फ़ाइलों पर निर्भर करती है तो संस्करण नियंत्रण में नहीं है, निर्यात काम नहीं करेगा।
मेन्मेन्थ

लेकिन ... मुझे एक अधिक सामान्य उत्तर की आवश्यकता थी। .Svn सिर्फ सबसे आम उदाहरण था, मैंने कहा कि प्रश्न में।
इते मूव -मालिमोवका

12

अगर आपको बहुत कुछ देखना पसंद नहीं है

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

चेतावनी, फिर -depthस्विच का उपयोग करें:

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

10

विंडोज में, आप "राइट एसवीएन फोल्डर्स" को अपने राइट क्लिक संदर्भ मेनू में जोड़ने के लिए निम्न रजिस्ट्री स्क्रिप्ट का उपयोग कर सकते हैं। उन pesky फ़ाइलों वाली किसी भी निर्देशिका पर इसे चलाएं।

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\" \""

साफ़ - सुथरा तरीका। ओपी के लिए सहायक नहीं, लेकिन +1 क्योंकि मैं प्रभावित था!
rrhartjr

यह कमाल का है। धन्यवाद। मुझे पता है कि यह सुपर पुराना है, लेकिन जो भी हो। मैं इसे वैसे भी प्यार करता हूँ।
एंथनी

9

आपके पास लगभग था। यदि आप एक कमांड के आउटपुट को दूसरे पैरामीटर में पास करना चाहते हैं, तो आपको xargs का उपयोग करना होगा। जोड़ा जा रहा है -print0बनाता है यकीन है कि स्क्रिप्ट सफेद स्थान के साथ पथ को संभाल कर सकते हैं:

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

2
कुछ प्रतिध्वनि के लिए जो काम किया गया था वह मिल गया। -name। svn | xargs rm -rf आपके संस्करण ने मुझे दिशा दी, हालांकि, धन्यवाद
Itay Moav -Malimovka


4

एक महत्वपूर्ण मुद्दा के रूप में, जब आप का उपयोग करना चाहते हैं खोल .svn फ़ोल्डर को हटाने के लिए आप की जरूरत है गहराई से खोज आदेश जैसे जैसे निर्देशिका है कि बस नष्ट कर दिया गया त्रुटि संदेश में प्रवेश करने और दिखा रोकने के लिए तर्क

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

नतीजतन, आप नीचे दिए गए आदेश का उपयोग कर सकते हैं:

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

यह वही है जिसकी मुझे तलाश थी और इसका सही उत्तर होना चाहिए।
luckytaxi


2

वैकल्पिक रूप से, यदि आप कार्य की प्रतिलिपि को संशोधित किए बिना प्रतिलिपि निर्यात करना चाहते हैं, तो आप rsync का उपयोग कर सकते हैं:

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

1
या svn निर्यात / पथ / से / रिपॉजिटरी का उपयोग करें, जो अनिवार्य रूप से एक ही काम करता है।
कालेब पेडरसन

लेखक ने विशेष रूप से कहा कि वह svn का उपयोग नहीं करना चाहता था; शायद उनके लक्षित वातावरण में svn स्थापित नहीं है।
pimlottc
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.