साथ ही प्रगति को देखते हुए एक निर्देशिका से अरबों फ़ाइलों को हटाना


36

मेरे पास 30 टीबी की एक निर्देशिका है जिसमें अरबों फाइलें हैं जो औपचारिक रूप से सभी जेपीईजी फाइलें हैं। मैं इस तरह से फ़ाइलों के प्रत्येक फ़ोल्डर को हटा रहा हूं:

sudo rm -rf bolands-mills-mhcptz

यह कमांड सिर्फ चलता है और कुछ भी नहीं दिखाता है कि यह काम कर रहा है या नहीं।

मैं यह देखना चाहता हूं कि यह फाइल डिलीट हो रही है या कमांड की वर्तमान स्थिति क्या है।


19
उत्तर नहीं: कभी-कभी यह उस सामान का बैकअप लेने के लिए तेज़ होता है जिसे आप रखना चाहते हैं, प्रारूपित करें, और उस सामान को पुनर्स्थापित करें जिसे आप रखना चाहते हैं। अन्य उत्तर: unix.stackexchange.com/questions/37329/…
एरिक टॉवर्स

2
यदि आप केवल प्रगति का विचार चाहते हैं, तो यह जानने के बजाय कि कौन सी विशेष फाइलें निकाली गई हैं, आप "df / dev / sd_whatever_the_drive_is" चला सकते हैं।
jamesqf

11
आपने एक ही डायरेक्टरी में अरबों फाइलों के साथ कैसे काम किया ??
मोनिका

1
@Michael Hampton लेकिन अगर फाइलें एक अलग डेटासेट नहीं हैं, तो इसमें लंबा समय लग सकता है। (ZFS पर) serverfault.com/questions/801074/…
v7d8dpo4

5
फ़ाइलों के अरबों, हुह? कोशिश करो rm -ri। यह मजेदार होगा!
OldBunny2800 21

जवाबों:


98

आप हटाए गए फ़ाइल के प्रति एक लाइन प्रिंट rm -vकरने के लिए उपयोग कर सकते हैं rm। इस तरह आप देख सकते हैं कि rmवास्तव में फ़ाइलों को हटाने के लिए काम कर रहा है। लेकिन अगर आपके पास अरबों फाइलें हैं तो आप देखेंगे कि rmअभी भी काम कर रहा है। आपको पता नहीं चलेगा कि कितनी फाइलें पहले ही डिलीट हो चुकी हैं और कितनी बाकी हैं।

उपकरण pvएक प्रगति अनुमान के साथ आपकी मदद कर सकता है।

http://www.ivarch.com/programs/pv.shtml

यहाँ है कि आप उदाहरण आउटपुट के rmसाथ कैसे लागू करेंगेpv

$ rm -rv dirname | pv -l -s 1000 > logfile
562  0:00:07 [79,8 /s] [====================>                 ] 56% ETA 0:00:05

इस आकस्मिक उदाहरण में मैंने बताया pvकि 1000फाइलें हैं। आउटपुट से pvपता चलता है कि 562 पहले ही हटा दिए गए हैं, बीता हुआ समय 7 सेकंड है, और पूरा होने का अनुमान 5 सेकंड में है।

कुछ स्पष्टीकरण:

  • pv -lpvबाइट्स के बजाय newlines द्वारा गिनती करने के लिए बनाता है
  • pv -s numberबताता है pvकि कुल क्या है ताकि यह आपको एक अनुमान दे सके।
  • logfileअंत में पुनर्निर्देशित स्वच्छ आउटपुट के लिए है। अन्यथा की स्थिति रेखा से pvआउटपुट के साथ मिश्रित हो जाती है rm -v। बोनस: आपके पास जो कुछ हटा दिया गया था, उसका लॉगफाइल होगा। लेकिन खबरदार फ़ाइल बहुत बड़ी हो जाएगी। /dev/nullयदि आपको लॉग की आवश्यकता नहीं है, तो आप पुनर्निर्देशित भी कर सकते हैं ।

इस आदेश का उपयोग करने वाली फ़ाइलों की संख्या प्राप्त करने के लिए:

$ find dirname | wc -l

यदि अरबों फाइलें हैं तो भी इसमें लंबा समय लग सकता है। आप pvयहां यह देखने के लिए उपयोग कर सकते हैं कि इसकी गिनती कितनी है

$ find dirname | pv -l | wc -l
278k 0:00:04 [56,8k/s] [     <=>                                              ]
278044

यहाँ यह कहता है कि 278k फाइलों को गिनने में 4 सेकंड का समय लगता था। अंत में सटीक गणना ( 278044) से आउटपुट है wc -l

यदि आप गिनती के लिए इंतजार नहीं करना चाहते हैं तो आप अनुमान के pvबिना या तो फ़ाइलों की संख्या का उपयोग कर सकते हैं या उपयोग कर सकते हैं :

$ rm -rv dirname | pv -l > logfile

इस तरह आपके पास खत्म होने का कोई अनुमान नहीं होगा लेकिन कम से कम आप देखेंगे कि कितनी फाइलें पहले ही डिलीट हो चुकी हैं। /dev/nullयदि आपको लॉगफ़ाइल की आवश्यकता नहीं है तो पुनर्निर्देशित करें ।


nitpick:

  • क्या आपको वास्तव में ज़रूरत है sudo?
  • आमतौर पर rm -rपुनरावर्ती को हटाने के लिए पर्याप्त है। कोई के लिए की जरूरत है rm -f

5
का अच्छा उपयोग pv, यह मानते हुए कि अरबों फाइलों को गिनना बहुत महंगा नहीं है; ;-) (इसे rmमापने में जितना समय लग सकता है, लगभग उतना ही समय लग सकता है !)
स्टीफन किट

7
@StephenKitt यह वास्तव में मुझे (और कई अन्य लोगों को) Windows फ़ाइल उपयोगिता के बारे में बताता है: यह हमेशा विफल रहता है, हटाने से पहले फ़ाइलों की संख्या और आकार को गिना जाता है, जब तक कि ड्राइव प्रोसेसर की तुलना में बहुत धीमा नहीं होता है, लगभग लेता है। वास्तविक विलोपन के रूप में लंबे समय तक!
wizzwizz4

@ wizzwizz4 वास्तव में! वहाँ की तुलना में यह करने के लिए अधिक है कि हालांकि IIRC - यह जांच करता है कि यह कर सकते हैं हटाने से पहले सब कुछ हटा कुछ भी विलोपन "सब कुछ या कुछ" होने की संभावना बढ़ाने के लिए,। कई साल पहले मैंने विंडोज के लिए एक फाइलसिस्टम ड्राइवर लिखा था, काफी कुछ विषमताएं थीं जिनसे हमें निपटना था, जिसमें से कुछ एक्सप्लोरर को हटाने के तरीके से संबंधित है, लेकिन मुझे विवरण याद नहीं है। (मुझे याद है कि एक फ़ोल्डर बनाने में नए फ़ोल्डर में किसी फ़ाइल को लिखना और हटाना शामिल है!)
स्टीफन किट

7
@StephenKitt शायद मैं गलत हूं, लेकिन डिस्क एक्सेस, टर्मिनल आउटपुट के अलावा अड़चन नहीं है? मेरा मानना ​​है कि pvइसके इनपुट के बावजूद, प्रगति बार प्रति सेकंड केवल एक बार रिफ्रेश होती है। इसलिए, टर्मिनल को प्रत्येक सेकंड में एक टन के बजाय केवल एक लाइन प्रदर्शित करने की आवश्यकता होती है। pvकेवल प्रत्येक नई पंक्ति के लिए एक काउंटर को बढ़ाने की जरूरत है जो उसका सामना करता है; लाइन रैपिंग करने की तुलना में तेज़ होना और टर्मिनल में लाइन प्रदर्शित करने के लिए क्या नहीं है। मुझे लगता है कि pvइस तरह से चलाने के कारण फ़ाइल निष्कासन सरलता से अधिक तेज़ होता है rm -rv
JoL

1
@ क्रिस्विंदरrm -rv dirname | pv -l -s $(find dirname | wc -l) > logfile
lesmana

28

Lesmana के जवाब की जाँच करें , यह मेरी तुलना में बहुत बेहतर है - विशेष रूप से अंतिम pvउदाहरण, जो मूल मौन की तुलना में अधिक लंबा नहीं लगेगा rmयदि आप /dev/nullइसकी तुलना में हैं logfile

अपने rmविकल्प का समर्थन मानते हुए (यह संभवतः लिनक्स चलाने के बाद से होता है), आप इसे वर्बोज़ मोड में चला सकते हैं -v:

sudo rm -rfv bolands-mills-mhcptz

जैसा कि कई टिप्पणीकारों द्वारा बताया गया है, यह बहुत धीमी गति से हो सकता है क्योंकि आउटपुट की मात्रा टर्मिनल द्वारा उत्पन्न और प्रदर्शित की जाती है। आप इसके बजाय आउटपुट को किसी फ़ाइल में पुनर्निर्देशित कर सकते हैं:

sudo rm -rfv bolands-mills-mhcptz > rm-trace.txt

और का आकार देखें rm-trace.txt


5
यह वास्तव में डिलीट डाउन को धीमा कर सकता है क्योंकि सभी आउटपुट जेनरेट किए जा रहे हैं और एक टर्मिनल को प्रदान किए जा रहे हैं :)
rackandboneman

2
बेशक यह धीमा हो जाएगा। किसी फ़ाइल में अरबों लाइनें लिखना शून्य समय में नहीं होता है।
user207421

23

एक अन्य विकल्प यह है कि फाइल सिस्टम की संख्या में कमी को देखने के लिए। किसी अन्य टर्मिनल में, चलाएं:

watch  df -ih   pathname

जैसे rm- जैसे प्रगति होगी वैसे - वैसे इनोड्स की गिनती घटती जाएगी । (जब तक कि फाइल में कई लिंक न हों, उदाहरण के लिए अगर पेड़ के साथ बनाया गया था cp -al)। यह संख्या-की-फ़ाइलों (और निर्देशिकाओं) के संदर्भ में विलोपन प्रगति को ट्रैक करता है। dfउपयोग किए गए -iस्थान के संदर्भ में ट्रैक नहीं करेगा।

आप iostat -x 4प्रति सेकंड I (O संचालन) और साथ ही kiB / s को भी देख सकते हैं , लेकिन यह शुद्ध मेटाडेटा I / O के लिए बहुत प्रासंगिक नहीं है।


यदि आप इस बारे में उत्सुक हैं कि rmवर्तमान में कौन सी फाइलें काम कर रही हैं, तो आप इसे संलग्न कर सकते हैं straceऔर unlink()अपने टर्मिनल पर (और getdents) सिस्टम कॉल के रूप में देख सकते हैं । उदा sudo strace -p $(pidof rm)। आप इसे बाधित किए बिना ^cसे अलग करने के लिए स्ट्रेस कर सकते हैं rm

मैं भूल जाता हूं कि rm -rनिर्देशिका को उस पेड़ में बदल दिया जाए जिसे वह हटा रहा है; यदि ऐसा है तो आप देख सकते हैं /proc/<PID>/cwd। इसकी /proc/<PID>/fdअक्सर एक निर्देशिका fd खुली हो सकती है, इसलिए आप इसे देख सकते हैं कि आपकी rmप्रक्रिया वर्तमान में क्या देख रही है।


2
df -ihवास्तव में rmप्रगति देखने का एक अच्छा सस्ता तरीका है ।
स्टीफन किट

BTW, यह BTRFS पर काम नहीं करता है, जहां इस्तेमाल किया-इनोड गिनती हमेशा शून्य होती है। :( उसी FAT32 के लिए, लेकिन आपके पास शायद आपके /bootEFI सिस्टम विभाजन पर अरबों फाइलें नहीं हैं ।
पीटर कॉर्ड्स

4

यद्यपि उपरोक्त सभी उत्तर उपयोग करते हैं rm, rmवास्तव में बड़ी संख्या में फ़ाइलों को हटाने में काफी धीमा हो सकता है, जैसा कि मैंने हाल ही में देखा है। जब एक .tar संग्रह से ~ 100K फ़ाइलों को वास्तव में निकालने में उन्हें हटाने की तुलना में कम समय लगता था। हालांकि यह वास्तव में आपके द्वारा पूछे गए प्रश्न का उत्तर नहीं देता है, लेकिन आपकी समस्या का एक बेहतर समाधान आपकी फ़ाइलों को हटाने के लिए एक अलग विधि का उपयोग करना हो सकता है, जैसे कि इस प्रश्न के उत्क्रमित उत्तर में से एक ।

मेरा व्यक्तिगत पसंदीदा तरीका उपयोग करना है rsync -a --delete। मुझे लगता है कि यह विधि काफी तेजी से प्रदर्शन करती है कि यह उस प्रश्न के सबसे उत्कीर्ण उत्तर पर आसानी से उपयोग करने के लायक है , जिसमें लेखक ने एक सी प्रोग्राम लिखा है जिसे आपको संकलित करने की आवश्यकता होगी। (ध्यान दें कि यह स्टडआउट के लिए संसाधित की जा रही हर फ़ाइल का उत्पादन करेगा, बहुत पसंद rm -rv; यह एक आश्चर्यजनक राशि द्वारा प्रक्रिया को धीमा कर सकता है। यदि आप यह आउटपुट नहीं चाहते हैं, rsync -aq --deleteतो आउटपुट को फ़ाइल के बजाय इसका उपयोग करें या रीडायरेक्ट करें।)

उस उत्तर के लेखक का कहना है:

कार्यक्रम अब (मेरे सिस्टम पर) 43 सेकंड में 1000000 फ़ाइलों को हटा देगा। इसके लिए निकटतम कार्यक्रम rsync -a --delete था जिसमें 60 सेकंड लगे (जो डिलीट-इन-ऑर्डर भी करता है, लेकिन एक कुशल निर्देशिका लुकअप नहीं करता है)।

मैंने पाया है कि यह मेरे उद्देश्यों के लिए पर्याप्त है। उस उत्तर से भी महत्वपूर्ण रूप से महत्वपूर्ण, यदि आप ext4 का उपयोग कर रहे हैं, तो कम से कम:

एक विचार के रूप में, किसी को प्रभावित निर्देशिका को हटा देना चाहिए और उसके बाद उसका रीमेक बनाना चाहिए। निर्देशिकाएं केवल आकार में वृद्धि करती हैं और निर्देशिका के आकार के कारण कुछ फाइलों के साथ भी खराब प्रदर्शन कर सकती हैं।


हुह, मुझे उम्मीद होगी rmऔर / या find --deleteकुशल हो। हटाने के दौरान बी-ट्री के असंतुलन से बचने के लिए क्रमबद्ध तरीके से हटाने के बारे में दिलचस्प बिंदु। यह सुनिश्चित नहीं है कि अन्य फ़ाइल सिस्टम पर कितना लागू होता है। XFS भी प्रति निर्देशिका लाखों फ़ाइलों के साथ महान नहीं है। BTRFS के बारे में IDK, लेकिन मैं इस धारणा के तहत हूं कि यह उस तरह की चीज के लिए अच्छा हो सकता है।
पीटर कॉर्ड्स

क्या यह दूसरा उद्धरण फाइलसिस्टम के प्रकार पर निर्भर नहीं करता है ...
मेनशेह

@ मीनाशाह अच्छा बिंदु, मैंने अपने उत्तर में इसे संपादित किया।
हाईटेककंप्यूटरजेक

3

एक चीज जो आप कर सकते हैं rm, वह है बैकग्राउंड में प्रक्रिया शुरू करना (बिना आउटपुट के, इसलिए इसे धीमा नहीं किया जाएगा) और फिर, एक साधारण (ए) कमांड के साथ अग्रभूमि में इसकी निगरानी करें :

pax> ( D=/path/to/dir ; rm -rf $D & while true ; do
...>   if [[ -d $D ]] ; then
...>     echo "$(find $D | wc -l) items left"
...>   else
...>     echo "No items left"
...>     break
...>   fi
...>   sleep 5
...> done )

27912 items left
224 items left
No items left

pax> _

find/wcकॉम्बो किसी भी आप इकाइयों आप चाहते देने में सक्षम उपकरण के साथ प्रतिस्थापित किया जा सकता।


(क) , नाभिकीय भौतिकी, रीमैन परिकल्पना, या क्रिसमस के लिए मेरी पत्नी को क्या खरीदना है, की तुलना में , अपेक्षाकृत सरल है।


0

कुछ समय पहले मैंने उस दर को प्रिंट करने के लिए कुछ लिखा था जो लाइनें छपी थीं। आप चला सकते हैं rm -rfv | ./counterऔर यह प्रति सेकंड / मिनट लाइनों को मुद्रित करेगा। हालांकि एक सीधी प्रगति नहीं है, यह आपको प्रगति दर पर कुछ प्रतिक्रिया देगा, शायद rmएक नेटवर्क फाइल सिस्टम में भटक गया या शायद इसी तरह?

कोड का लिंक यहां है:

http://www.usenix.org.uk/code/counter-0.01.tar.gz

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