फ़ाइलों को पुन: हटा दें


140

क्या किसी के पास उन pesky ._ और .DS_Store फ़ाइलों को हटाने के लिए एक समाधान है जो किसी को मैक से ए लिनक्स सर्वर पर फाइल ले जाने के बाद मिलता है?

एक आरंभ निर्देशिका निर्दिष्ट करें और इसे जाने दें? जैसे / var / www / html / नीचे ...


हालाँकि यह कोई डुप्लिकेट IMO नहीं है, आपको इस पर एक नज़र
डालनी

यद्यपि आप जो पूछ रहे हैं वह नहीं। मेरा तर्क है कि यह एक बेहतर समाधान है: unix.stackexchange.com/questions/9665/…
विक्टर

जवाबों:


169

निर्देशिका में परिवर्तन, और उपयोग करें:

find . -name ".DS_Store" -print0 | xargs -0 rm -rf
find . -name "._*" -print0 | xargs -0 rm -rf

परीक्षण नहीं, उन्हें पहले xargs के बिना कोशिश करो!

आप पहले निर्देशिका को बदलने के बजाय, निर्देशिका के साथ खोज के बाद की अवधि को बदल सकते हैं।

find /dir/here ...

2
मुझे पता है कि उसका सवाल इसके लिए नहीं पूछा गया था, लेकिन मैं कभी याद नहीं रख सकता: क्या आपका उदाहरण रिक्त स्थान के साथ फ़ाइल नाम को संभालता है?
ग्रुन्डेफ्लेक

4
हाँ, यह वही है जो Print0 और -0 से xargs के लिए है। आम तौर पर यह रिक्त स्थान को सही तरीके से नहीं संभालता है, हालांकि प्रिंट0 के साथ यह फ़ाइल नाम को पंक्ति के अंत में एक अशक्त चरित्र के साथ प्रिंट करेगा, जिसे -0 के साथ xarg तब व्हॉट्सएप के मौका के बिना xargs के लिए पूर्ण पथ को पारित करने के लिए उपयोग करेगा आरएम कमांड के लिए एक दूसरे या तीसरे पैरामीटर का उपयोग किया जा रहा है जो वास्तव में खराब हो सकता है!
X-Istence

7
@X: नए खोजपत्र एक -deleteकार्रवाई का समर्थन करते हैं , जो इसे छोटा कर सकता है। @JT: यह खोज पुनरावर्ती रूप से होती है .। निर्भर करता है कि कितनी फाइलें और उपनिर्देशिकाएं हैं ... क्या आप सिर्फ उन लोगों को अपलोड करने से मना नहीं कर सकते?
इफिशिएंट

1
-rइस मामले में (पुनरावर्ती) ध्वज का उपयोग करने की अनुशंसा नहीं की जाती है क्योंकि आप किसी भी निर्देशिका को हटाना नहीं चाहते हैं ..
डैनियल ज़ोहर

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


86

नए खोजकर्ता समर्थन करते हैं -delete, इसलिए:

find . -name ".DS_Store" -delete

-printविलोपन की सूची प्राप्त करने के लिए भी जोड़ें ।

यदि आपके पास अप-टू-डेट POSIX प्रणाली है, तो कमांड आपके लिए काम करेगा, मुझे विश्वास है। कम से कम यह मेरे लिए OS X 10.8 पर काम करता है और दूसरों के लिए काम करता है जिन्होंने इसे macOS 10.12 (Mojave) पर टेस्ट किया है।

@ X-Istence की पोस्ट पर एक टिप्पणी में @ephemient का श्रेय (यह अपने स्वयं के उत्तर को वारंट करने के लिए पर्याप्त सहायक था)।


1
OSX 10.6 में भी काम करता है।
Hoss

3
सबसे साफ और सरल उपाय, +1!
सीमित

6
@OneOfOne: जैसा कि मेरी टिप्पणी कहती है, मुझे यह @ इफेमिएंट से मिला। कोसने के लिए एक शुरुआत के रूप में, मैंने आपका (शायद अधिक सही) समाधान बहुत कम पठनीय और प्रयोग करने योग्य पाया। वे कार्यात्मक रूप से समान हो सकते हैं लेकिन मुझे लगता है कि यह वाक्यविन्यास अधिक स्पष्टता प्रदान करता है।
रैट्रे

1
''। ' आवश्यक नहीं है क्योंकि findडिफ़ॉल्ट रूप से वर्तमान कार्य निर्देशिका में पुनरावृत्ति होती है।
टॉम रसेल

कार्यक्रम के नए संस्करणों में, निर्देशिका को छोड़ा जा सकता है, और यह वर्तमान कार्य निर्देशिका ( विकिपीडिया ) का अर्थ होगा । आपको अभी भी .macOS 10.12 (सिएरा) पर जरूरत है ।
डिम पिलाफ़ियन

18

सरल आदेश:

rm `find ./ -name '.DS_Store'` -rf
rm `find ./ -name '._'` -rf

सौभाग्य!


1
यह बहुत अच्छा काम करता है। लेकिन सावधानी से एक शब्द rm -i बोलें , मैंने सिर्फ इस खोज का उपयोग किया है । / -नाम '* py'`r , which did NOT prompt me to delete files. you will need to take it on the end (i.e. -rfi`)। मेरी बैकअप स्क्रिप्ट के लिए भगवान का शुक्र है।
रंजडिलन

1
यदि बहुत सी फाइलें हैं, तो यह त्रुटि के साथ टूट जाती है:-bash: /bin/rm: Argument list too long
विक्टर

12
cd /var/www/html && find . -name '.DS_Store' -print0 | xargs -0 rm
cd /var/www/html && find . -name '._*' -print0 | xargs -0 rm

2
मुझे यह बेहतर लगा, क्योंकि "rm" में "-r" नहीं है, जो इस विशिष्ट कार्य के लिए आवश्यक नहीं है।
लॉटऑफ्रीटाइम

6

आप बैश के बजाय zsh पर जा सकते हैं। यह आपको निर्देशिका ट्री में कहीं भी फ़ाइलों से मिलान करने के लिए ** का उपयोग करने देता है:

$ rm /var/www/html/**/_* /var/www/html/**/.DS_Store

आप उन्हें इस तरह से जोड़ सकते हैं:

$ rm /var/www/html/**/(_*|.DS_Store)

Zsh में बहुत सारी अन्य विशेषताएं हैं जिनमें बैश की कमी है, लेकिन यह अकेला ही स्विच के लिए लायक है। यह सबसे (शायद सभी) लिनक्स डिस्ट्रो के साथ-साथ साइबरविन और ओएस एक्स में उपलब्ध है।

आप zsh साइट पर अधिक जानकारी पा सकते हैं ।


1
एक संभावित समस्या: चूंकि आप xargs का उपयोग नहीं करते हैं, आप कमांड-लाइन तर्क लंबाई प्रतिबंध में भाग सकते हैं। इसके अलावा, बैश 4 **भी सपोर्ट करता है :-) (हालांकि डिफ़ॉल्ट रूप से नहीं, shopt -s globstarसेट करने की आवश्यकता है)
ईपीएमिएंट

4
find . -name "FILE-TO-FIND"-exec rm -rf {} \;

प्रत्येक फ़ाइल के लिए निष्पादन का उपयोग करना तेज़ नहीं है। यह तेजी से उन्हें पता लगाने के लिए है और फिर एक बार आरएम को आमंत्रित करने के लिए xargs का उपयोग करें।
X-Istence

3
हालाँकि, यदि आपके पास findइसका समर्थन करता है, तो +यह xargs-like है: find . -name "FILE-TO-FIND" -exec rm -rf {} +- (इसके अलावा, आप पहले एक स्थान याद कर रहे हैं -exec)
आगे की सूचना तक रोक दिया गया।

3
हमारे दिन में हमारे पास कभी भी xargs नहीं था। और हमें स्कूल जाना था, दोनों रास्ते ऊपर की ओर .......
मार्टिन बेकेट

3

"Thumbs.db" को पुनरावर्ती रूप से हटाने के लिए उदाहरण;

find . -iname "Thumbs.db" -print0 | xargs -0 rm -rf

द्वारा मान्य करें:

find . -iname "Thumbs.db"

यह अब, वर्तमान पथ के अंदर "Thumbs.db" के साथ किसी भी प्रविष्टि को प्रदर्शित नहीं करना चाहिए।


कृपया सुनिश्चित करें कि आपका उत्तर हटाए जाने की एक सूची प्रिंट करता है और समझाता है कि कोई व्यक्ति क्यों उपयोग करना चाहता है xargsऔर print0इसके बजाय exec(कारण हैं)।
जोश हबदास


2

अगर आपके पास बैश 4.0 ++ है

#!/bin/bash
shopt -s globstar
for file in /var/www/html/**/.DS_Store /var/www/html/**/._ 
do
 echo rm "$file"
done

2
प्रत्येक फ़ाइल के लिए rm की एक नई प्रतिलिपि चलाना व्यर्थ है।
X-Istence

2
@ X-Istence प्रीमेच्योर ऑप्टिमाइज़ेशन बेकार है
Lucina

मौलिकता और अधिक हाल के बैश नवाचारों के उपयोग के लिए तैयार।
जोश हबदास

1

ध्यान देने योग्य कुछ बातें:

'-डेलीट' पुनरावर्ती नहीं है। तो अगर। टेम्पररी इटम्स (फोल्डर) में फाइलें हैं, तो कमांड विफल हो जाती है।

मैक द्वारा बनाई गई इन pesky फ़ाइलों में से बहुत से हैं: .DS_Store ._। DS_Store .TemporaryItems .apdisk

यह एक आदेश उन सभी को संबोधित करता है। कई मैचों के लिए बार-बार दौड़ने से बचाता है।

find /home/foo \( -name '.DS_Store' -or -name '._.DS_Store' -or -name '._*' -or -name '.TemporaryItems' -or -name '.apdisk' \) -exec rm -rf {} \;

0

यह भी काम करता है:

sudo rm -rf 2018-03-*

यहां प्रारूप 2018-03 के नामों के साथ आपकी डिलीट की गई फाइलें- (कुछ और)

इसे सरल रखें


आप यह नहीं समझाते हैं कि कोई व्यक्ति कब एक कमांड के साथ उपसर्ग करना चाहता है sudoऔर न ही आपको कोई जानकारी प्रदान rmकरता है कि आपके उत्तर के संदर्भ में कैसे काम करता है।
जोश हबदास
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.