उनके नाम पर रिक्त स्थान वाली फ़ाइलों को हटाना


10

मैं उनके नाम की जगह वाली सभी फाइलों को हटाने की कोशिश कर रहा हूं। मैं निम्नलिखित कमांड का उपयोग कर रहा हूं। लेकिन यह मुझे एक त्रुटि दे रहा है

आदेश: ls | egrep '. ' | xargs rm

यहाँ अगर मैं केवल ls | egrep '. 'कमांड का उपयोग कर रहा हूँ तो यह मुझे फ़ाइल नाम में रिक्त स्थान के साथ सभी फ़ाइल नाम दे रहा है। लेकिन जब मैं rm को आउटपुट पास करने की कोशिश कर रहा होता हूं, तो सभी स्पेस (प्रमुख या अनुगामी) डिलीट हो जाते हैं। इसलिए मेरी आज्ञा का ठीक से क्रियान्वयन नहीं हो रहा है।

अपने नाम में कम से कम एक स्थान रखने वाली फ़ाइल को हटाने के बारे में कोई संकेत?

जवाबों:


29

आप rmकमांड पर मानक ग्लोबिंग का उपयोग कर सकते हैं :

rm -- *\ *

यह किसी भी फ़ाइल को हटा देगा जिसके नाम में एक स्थान है; अंतरिक्ष बच गया है इसलिए शेल इसे विभाजक के रूप में व्याख्या नहीं करता है। जोड़ने --से फ़ाइल नाम के साथ शुरू होने वाले फ़ाइल नाम के साथ समस्याओं से बचना होगा (उन्हें तर्क द्वारा व्याख्या नहीं की जाएगी rm)।

यदि आप हटाने से पहले प्रत्येक फ़ाइल की पुष्टि करना चाहते हैं, तो -iविकल्प जोड़ें :

rm -i -- *\ *

4
आप DEFINITELY echoटाइपो से सुरक्षा के लिए इसे पहले चलाना चाहते हैं । echoसामने की ओर जोड़ें और यह उन सभी फाइलों को प्रिंट कर लेगा जो इसे हटाने जा रही हैं।
बाइक

1
अनुज, यही कारण है कि यह सबसे अधिक उत्थान है, क्योंकि यद्यपि findशक्तिशाली है, कभी-कभी आपको मशीन गन के साथ चिकन को मारने की आवश्यकता नहीं होती है। UNIX व्यवस्थापक आमतौर पर find(उदाहरण के लिए) "A" अक्षर से शुरू होने वाली सभी फ़ाइलों को हटा नहीं सकते हैं ... एक बस होगा rm A*। इसी तरह रिक्त स्थान वाली फ़ाइलों को हटाने के लिए, rm काम कर सकता है। दूसरे शब्दों में, मूर्ख मत बनो क्योंकि अंतरिक्ष अदृश्य है और शेल द्वारा विशेष रूप से व्यवहार किया जाता है। बस इसे छोड़ दें, जैसा कि स्टीफन किट ने किया है, और आप इसे किसी अन्य चरित्र की तरह सोच सकते हैं।
माइक एस

14

मैं पार्सिंग lsआउटपुट से बचूंगा

क्यों नहीं :

find . -type f -name '* *' -delete

कोई समस्या नहीं rm:-)।

हालांकि यह पुनरावर्ती है और वर्तमान निर्देशिका और नेस्टेड निर्देशिकाओं में अंतरिक्ष के साथ सभी फ़ाइलों को हटा देगा, जैसा कि टिप्पणियों में उल्लेख किया गया है।


4
(1) आप -name '* *'रेगेक्स के बजाय उपयोग कर सकते हैं ; और (2) आप -print0 | xargs -0 rm -i@ स्टीफनकिट की चिंता का समाधान करने के लिए उपयोग कर सकते हैं ।
केविन

1
की कोई जरूरत नहीं xargs। बस का उपयोग करें-exec rm -i '{}' +
आर .. गिटहब स्टॉप हेल्पिंग IC

1
@Mdd इसे 8-बिट गेमिंग कंसोल की तुलना में अधिक नुकसान पहुंचा है। mywiki.wooledge.org/ParsingLs
Daenyth

1
यदि आप उपनिर्देशिका से बचना चाहते हैं, तो उपयोग करें find . -maxdepth 1 -name '* *' -delete
मिकेल

1
@BenjaminW। तय किया?
solsTiCe

6

इस मान लीजिए नाम "अजीब फ़ाइल" देखें

समाधान एक

rm strange\ file

समाधान दो

rm "strange file"

समाधान तीन

ls -i "strange file"

आप फिर इनोड को देखते हैं

find . -inum "numberoofinode" -exec rm {} \;

जैसे बहुत ही अजीब फ़ाइल नामों के मामले में

!-filename or --filename

उपयोग

rm ./'!-filename'

4

से man xargs

xargs मानक इनपुट से आइटम पढ़ता है, जिसे रिक्त स्थान (जो डबल या सिंगल कोट्स या बैकस्लैश के साथ संरक्षित किया जा सकता है) या नईलाइनों द्वारा सीमांकित किया जाता है, और कमांड निष्पादित करता है (डिफ़ॉल्ट / बिन / गूंज है) एक या एक से अधिक बार किसी भी प्रारंभिक-तर्क के बाद। मानक इनपुट से पढ़ी गई वस्तुओं द्वारा। मानक इनपुट पर खाली लाइनों को अनदेखा किया जाता है।

हम (ज्यादातर) xargs परिसीमन को एक नई सीमा में बदलकर आपकी प्रारंभिक कमांड को ठीक कर सकते हैं:

ls | egrep '. ' | xargs -d '\n' rm (ऐसा मत करो ... पर पढ़ें)

लेकिन क्या होगा अगर फ़ाइल नाम में एक नई रेखा है?

touch "filename with blanks and newline"

क्योंकि यूनिक्स फ़ाइलनाम में रिक्त स्थान और नए अंक शामिल हो सकते हैं , यह डिफ़ॉल्ट व्यवहार अक्सर समस्याग्रस्त होता है; फ़ाइल नाम जिसमें रिक्त स्थान और / या नई लाइनें हैं, गलत तरीके से xargs द्वारा संसाधित किए जाते हैं। इन स्थितियों में -0 विकल्प का उपयोग करना बेहतर होता है , जो ऐसी समस्याओं से बचाता है।

ls वास्तव में एक मानव द्वारा प्रत्यक्ष उपभोग के लिए एक उपकरण है , इसके बजाय हमें उस findकमांड का उपयोग करने की आवश्यकता है जो फ़ाइल नाम को एक अशक्त चरित्र ( -print0) के साथ अलग कर सकता है । हमें इनपुट ( -z) और आउटपुट ( -Z) को अलग करने के लिए अशक्त वर्णों का उपयोग करने के लिए grep को भी बताना होगा । अंत में, हम xargs को null वर्णों ( -0) का उपयोग करने के लिए कहते हैं

find . -type f -print0 | egrep '. ' -z -Z | xargs -0 rm



-1

इस तरह से करने के लिए, आपको -Zgrep के विकल्प की आवश्यकता होगी , और -0xargs के विकल्प की। लेकिन मैं इसे इस तरह से नहीं करूंगा ( lsयह काम के लिए सही उपकरण नहीं है, कंप्यूटर को इसके आउटपुट को पढ़ने के लिए प्राप्त करने में कई समस्याएं हैं)।

बेहतर तरीके से अन्य उत्तर देखें।


भी

ls | …के बराबर है ls -d *औरecho * | …

जिसकी सभी को समस्या है। इसलिए lsइस तरह का उपयोग न करें , दूसरे उत्तर से समाधान का उपयोग करें।


इसके अलावा ls *जब पाइप फ़ाइल नाम आउटपुट नई लाइन सीमांकित। echo(कम से कम कुछ echoकार्यान्वयन) बैकस्लैश दृश्यों का विस्तार करता है। grep -Zउपयोग करते समय फ़ाइल नाम NUL- सीमांकित लिखने के लिए है -l, यह यहाँ मदद नहीं करेगा। यदि आप चाहते हैं -z, तो यह भी मदद नहीं करेगा क्योंकि अधिकांश lsकार्यान्वयन में फ़ाइल नाम NUL सीमांकित आउटपुट के लिए एक विकल्प की कमी है। printf '%s\0' * | grep -z ' ' | xargs -r0 rm -fहालांकि कुछ ऐसा कर सकता है ।
स्टीफन चेजेलस

1
@ कुसलानंद मुझे लगता है कि मैंने इसे ठीक कर लिया है।
ctrl-alt-delor-delor
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.