फ़ाइलों को केवल कैसे हटाएं, लेकिन निर्देशिका संरचना रखें?


17

मैं हर फ़ाइल को हटाना चाहता हूं, लेकिन फ़ोल्डर की संरचना को बनाए रखें। क्या उधर रास्ता है?

नोट: (मैं GNU बैश 4.1.5 का उपयोग कर रहा हूँ)।


1
आप वास्तव में "बहिष्कृत" का क्या मतलब है? क्या आप किसी प्रकार की कमांड का उपयोग कर रहे हैं? यदि ऐसा है तो कृपया इसे शामिल करने के लिए अपने प्रश्न को अपडेट करें।
स्लम


मुझे लगता है कि आपका मतलब है कि हर फ़ाइल को हटा दें।
स्लम

1
@ एसएलएम मैं उस कमांड के साथ अपडेट किया गया जिसका उपयोग मैं आमतौर पर फाइलों को बाहर करने के लिए करता हूं।
टॉम ब्रिटो

नहीं, आपने नहीं किया है :-) या, यदि आपने किया, तो आपने इसे फिर से हटा दिया
मोग कहते हैं कि मोनिका

जवाबों:


19

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

find . ! -type d -exec rm '{}' \;

यह वर्तमान कार्यशील निर्देशिका के नीचे, निर्देशिकाओं को छोड़कर हर एक फ़ाइल को हटा देगा। इस आज्ञा के साथ अत्यंत सावधान रहें।

यदि findआपकी मशीन का संस्करण इसका समर्थन करता है, तो आप इसका उपयोग भी कर सकते हैं

find . ! -type d -delete

@ एसएलएम: मुझे यकीन नहीं है कि यह कितना पोर्टेबल है। मैंने इसे द्वितीयक विकल्प के रूप में जोड़ा है। मुझे बस एहसास हुआ कि मेरे संपादन ने मेरे जवाब को लगभग आपके समान बना दिया। उसके लिए माफ़ करना; यह मेरा इरादा नहीं था।

फाइलों में रिक्त स्थान के खिलाफ '{}' गार्ड है? मैं आपको हर समय उपयोग करते हुए देखता हूं और मुझे नहीं लगता कि मैंने इसका उपयोग करने से पहले आपको इसका समाधान करते हुए देखा था।
स्लम

GNU से मैनपेज खोजें: "ध्यान दें कि ब्रेसिज़ एकल उद्धरण चिह्नों में संलग्न हैं ताकि उन्हें व्याख्या के रूप में स्क्रिप्ट विराम चिह्न से बचाया जा सके।" मुझे यकीन नहीं है कि जब यह आवश्यक है। मैं ज्यादातर इसे आदत से बाहर करता हूं। findआदेश कभी नहीं उद्धरण चिह्नों को देखता है। यह सिर्फ {}मार्कर को एक तर्क के रूप में देखता है।

मैं इसे उदाहरण पर देखता हूं, लेकिन टेम्पलेट यह दिखाते हैं, " -exec command {} +" और यह " -exec command ;"। मैंने \;अतीत में कभी भी '{}' का उपयोग नहीं किया है।
स्लम

@ एसएलएम: टेम्प्लेट अर्धविराम से बचने को भी नहीं दिखाते हैं, जिसे निष्पादित करने के लिए एक शेल का उपयोग करते समय आमतौर पर आवश्यक होता है find। मुझे लगता है कि टेम्प्लेट यह दिखाने के लिए हैं कि findकमांड को किस तर्क की जरूरत है और शेल से संबंधित किसी भी चीज के बारे में चिंता न करें

7

आप findप्रत्येक फ़ाइल का पता लगाने के लिए कमांड का उपयोग कर सकते हैं लेकिन निर्देशिका संरचना को बनाए रख सकते हैं:

$ find /some/dir -type f -exec rm {} +

इस यूनिक्स और लिनक्स के अनुसार क्यू एंड ए शीर्षक: ग्नू और कुछ गोले के लिए {} मास्किंग - जो? , {}एकल टिक्स के साथ भागने ( ') जैसे बश के रूप में आधुनिक दिन के गोले के साथ अब आवश्यक नहीं प्रतीत होता है।


1

वर्तमान निर्देशिका और उपनिर्देशिकाओं में हर नियमित फ़ाइल को हटाने का आसान तरीका पुनरावर्ती:

zsh -c 'rm **/*(.)'

केवल zsh में टाइप द्वारा फाइलों का मिलान करने के लिए ग्लोबिंग क्वालिफायर हैं । हालाँकि, rmकमांड निर्देशिकाओं पर काम नहीं करता है, इसलिए बैश में, आप उपयोग कर सकते हैं

shopt -s globstar
rm **/*

rmहालांकि इसके अलावा अन्य कमांड के लिए यह काम नहीं करता है । सामान्य तौर पर, आप इसका उपयोग कर सकते हैं find:

find . -type f -delete

या यदि आपका findसमर्थन नहीं करता है -delete:

find . -type f -exec rm {} +

-2

मुझे निर्देशिका संरचना को हटाने के साथ एक पथ और इसके उप निर्देशिकाओं (समय के अनुसार फ़िल्टरिंग) से फ़ाइलों को हटाने की समान आवश्यकता थी।

और मैंने नीचे प्रारूप का उपयोग किया है जो मेरे लिए काम करता है।

find / test123 / home / test_file_hip / data / nfs -mtime +6 -type f -exec rm {} \;

सिंटेक्स: (फ़ाइल का पथ) -MIME (दिनों से अधिक या कम) -type f -exec rm {} \;

-प्रकार: "d" डायरेक्टरी -exec के लिए फ़ाइल "f" के प्रकार का उल्लेख करें: कमांड rm निष्पादित करें: निकालें {}: खोज कमांड का आउटपुट

नोट: उपयोग करने से पहले इसका परीक्षण करें। अगर मुझे कुछ भी याद है तो कृपया सही या अपडेट करने के लिए स्वतंत्र महसूस करें।


1
चूँकि यह एक अतिरिक्त आवश्यकता है जिसका उल्लेख ओपी ने नहीं किया था, और चूँकि मूल find ... rmसंरचना पहले ही कवर की जा चुकी है, मुझे यकीन नहीं है कि इस प्रश्न के उत्तर के रूप में यह एक मूल्यवान योगदान है।
जेफ स्कालर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.