शेल में बड़ी मात्रा में फ़ाइलों का प्रबंधन कैसे करें?


9

$ ls ./ir_with_huge_amount_of_files/errors/

मान लीजिए कि एक निर्देशिका यूनिक्स टाइमस्टैम्प के साथ चित्रों से भरा है, मेरा मतलब है कि कई जीबी या उससे भी अधिक में मापा जाता है। शेल-कमांड जैसे lsअतिप्रवाह-शैली की चेतावनी मिलेगी क्योंकि वे लाखों (या अधिक) चित्रों के साथ काम करने के लिए डिज़ाइन नहीं किए गए हैं। मैं इतनी बड़ी मात्रा में फ़ाइलों का प्रबंधन कैसे कर सकता हूं? यदि, उदाहरण के लिए, मैं बीच में चित्र ढूंढना चाहता हूं (नाम और निर्माण समय में टाइमस्टैम्प के अनुसार), क्या कुछ फ़ाइल-सिस्टम है जो एक अंतर्निहित खोज सुविधा प्रदान करता है? आप किन आदेशों का उपयोग करेंगे? मैंने सहज lsऔर कोशिश कीfindआवश्यक झंडों के साथ लेकिन वे या तो बहुत धीमे थे या चेतावनी उत्पन्न कर रहे थे, इसलिए मैं सोच रहा हूं कि या तो मुझे बेहतर फाइल-सिस्टम की जरूरत है या डीबी या कुछ और जैसा कि चित्रों को प्री-इंडेक्स करने के लिए है। मुझे मूल रूप से एक सरणी की आवश्यकता है जिसके लिए फोटो के इनोड्स को कालानुक्रमिक क्रम में रखा जाना चाहिए। उसको कैसे करे? बाद में, यूनिक्स-टाइमस्टैम्प के साथ मेटाडेटा जोड़ा जा सकता था।

[अपडेट करें]

वर्तमान उत्तरों में एक गंभीर दोष है, लोग केवल अनुभवजन्य परीक्षणों के बिना क्रमबद्ध उत्तर पोस्ट करते हैं। यदि उन्होंने अपने सुझावों का परीक्षण किया होता, तो वे शायद विफल हो जाते। इसलिए, मैंने आपको एक कमांड-लाइन टूल बनाया है जिसके द्वारा आप सैंडबॉक्स को बड़ी मात्रा में फाइल बनाने के लिए बना सकते हैं और अपने सुझावों का परीक्षण कर सकते हैं जैसे 1e7 फाइलों की मात्रा। फ़ाइलों को उत्पन्न करने में बहुत समय लग सकता है इसलिए धैर्य रखें। यदि कोई ऐसा करने का त्वरित तरीका जानता है, तो कृपया कोड को संपादित करें। python code.py --helpसहायता प्राप्त करने के लिए टाइप करें। मज़े करो!

बहुत सी dirred फ़ाइलों को बनाने के लिए उदाहरण का उपयोग करें

$ ls ./data2
ls: ./data2: No such file or directory
$ python testFill.py -n 3 -d 7                                                 
$ tree data2/                                                                  
data2/
|-- 0
|   |-- 1302407302636973
|   |-- 1302407302638022
|   `-- 1302407302638829
|-- 1
|   |-- 1302407302639604
|   |-- 1302407302641652
|   `-- 1302407302642399
|-- 2
|   |-- 1302407302643158
|   |-- 1302407302645223
|   `-- 1302407302646026
|-- 3
|   |-- 1302407302646837
|   |-- 1302407302649110
|   `-- 1302407302649944
|-- 4
|   |-- 1302407302650771
|   |-- 1302407302652921
|   `-- 1302407302653685
|-- 5
|   |-- 1302407302654423
|   |-- 1302407302656352
|   `-- 1302407302656992
`-- 6
    |-- 1302407302657652
    |-- 1302407302659543
    `-- 1302407302660156

7 directories, 21 files

कोड testFill.py

# Author: hhh
# License: ISC license

import os, math, time, optparse, sys

def createHugeAmountOfFiles(fileAmount, dirAmount):
   counter = 0
   DENSITY = 1e7
   dir = "./data/"

   do = dir+str(counter)+"/"
   while (os.path.exists(do)):
      counter = counter+1
      do = dir+str(counter)+"/"

   os.mkdir(do)

   for d in range(int(dirAmount)):
      for f in range(int(fileAmount)):
         timeIt = int(time.time()*1e6)
         if (not os.path.exists(do)):
            os.mkdir(do)

         if (timeIt % DENSITY == 0):
            counter = counter+1
            do = dir+str(counter)+"/"

            if (not os.path.exists(do)):
               os.mkdir(do)


         do = dir+str(counter)+"/"
         if(not os.path.exists(do)):
            os.mkdir(do)

         f = open(do+str(timeIt), 'w')
         f.write("Automatically created file to test Huge amount of files.")
         f.close()
      counter = counter +1


def ls(dir):
   for root, dirs, files in os.walk("./data/"+dir):
      print(files)

def rm(dir):
   for root, dirs, files in os.walk("./data/"+dir):
      for f in files:
         os.remove("./data/"+dir+"/"+f)


def parseCli():
   parser = optparse.OptionParser()
   parser.add_option("-f", "--file", dest="filename",
                     help="Location to remove files only in ./Data.", metavar="FILE")
   parser.add_option("-n", "--number", dest="number",
                     help="Number of files to generate", metavar="NUMBER")
   parser.add_option("-r", "--remove", dest="remove",
                     help="Data -dir content to remove", metavar="NUMBER")
   parser.add_option("-d", "--dir", dest="dir",
                     help="Amount of dirs to generate", metavar="NUMBER")
   parser.add_option("-q", "--quiet",
                     action="store_false", dest="verbose", default=True,
                     help="don't print status messages to stdout")

   return parser.parse_args()

def main():
   (options, args) = parseCli()

   if (options.filename):
      ls(options.filename)
   if (options.number and options.dir):
      createHugeAmountOfFiles(options.number, options.dir)
   if (options.remove):
      rm(options.remove)


main()

2
इस पैमाने पर डेटासेट के लिए @hhh ठीक से इंडेक्स-एड db शायद एकमात्र विकल्प है
xenoterracide

@xenoterracide: लेकिन यहां तक ​​कि dbs को सरणियों की तरह कुछ के साथ तेजी से खोज को लागू करना चाहिए, db एक ओवरकिल लगता है। चित्र लेने के लिए बात स्रोत यहाँ है: github.com/fsphil/fswebcam । शायद, मैं इसे थोड़ा सा समय बचा सकता हूं क्योंकि यह तस्वीर बचाता है इसलिए मैं फाइल के लिए इनोड-नंबर और यूनिक्स-टाइम-स्टैम्प के साथ एक पंक्ति जोड़ सकता हूं। अब चित्रों के साथ नहीं बल्कि रेखा के साथ, चित्रों की खोज करना बहुत तेज़ होगा। या इससे भी अधिक आसानी से, हर बार किसी चित्र को एक डिस्क पर सहेजा जाता है, मैं एक लाइन को उसके टाइम-स्टैंप की फ़ाइल में जोड़ता हूं। गोल-गोल घोल। लेकिन वर्तमान तस्वीरों के साथ समस्या का समाधान नहीं होगा इसलिए प्रासंगिक प्रश्न।

@ क्या आप किस फाइलसिस्टम का उपयोग कर रहे हैं? या यह बात अभी तक नहीं है ... ext में कुछ प्रदर्शन बढ़ाने वाली विशेषताएं हैं जो डिफ़ॉल्ट रूप से नहीं हो सकती हैं। हालांकि उन लोगों को भी जो आप बात कर रहे हैं पैमाने पर सौदा नहीं होगा। DB इन चीजों के लिए अनुकूलित है और इनसे निपटने के लिए विभिन्न अनुक्रमण समाधान हैं। उदाहरण के लिए एक btree इंडेक्स केवल एक सरल सरणी नहीं है ...
xenoterracide

@xenoterracide: ext3, निश्चित रूप से या तो यह मायने नहीं रखता है कि क्या यह मायने रखता है। मुझे लगता है कि मैंने जो समाधान दिखाया था, वह भविष्य की खोज समस्या के लिए समस्या को हल करता है, लेकिन यह वर्तमान तस्वीरों के साथ बिल्कुल भी मदद नहीं करता है, इसे खोजने के लिए बहुत समय लगता है।

1
क्या आपके पास एक ही निर्देशिका में लाखों फाइलें हैं? यदि ऐसा है तो आप उन्हें फ़ाइल नाम के पहले वर्णों के आधार पर एक या दो-स्तरीय गहरे उप-विभाजनों द्वारा विभाजित करने पर विचार कर सकते हैं, जैसे:a/b/abcdef.jpg
एलेक्स

जवाबों:


4

एक अलग शेल का प्रयास करें। मैं उदाहरण के लिए zsh को आज़माने की सलाह देता हूँ, और देखें कि क्या यह अधिक मापदंडों की अनुमति देता है।

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

यदि आईएसओ 8601 टाइमस्टैम्प फ़ाइल नाम का हिस्सा है, तो बस साल, महीने या दिन से विभाजित करें।


1
ls और ढूंढें या तो बाश या zsh में बिलीव नहीं हैं, इसलिए यह स्पष्ट नहीं है कि स्विचिंग गोले इस उदाहरण में कैसे मदद करेंगे।
रॉबिन ग्रीन

यह शेल विस्तार के बारे में है। यदि शेल ग्लोबिंग का विस्तार नहीं कर सकता है, तो यह मुद्दा हो सकता है।
पोलमन को

मैंने लगभग 1e6 फ़ाइलों पर कमांड चलाने वाले कुछ परीक्षण किए, ZSH समान समस्याओं का सामना करते हैं "$ cp * Test/ ksh: cp: Argument list too long % rm * zsh: sure you want to delete all the files in /home/user/Downloads [yn]? y zsh: argument list too long: rm % ls * zsh: argument list too long: ls ":। क्षमा करें, लेकिन मैं यह नहीं देख सकता कि यह प्रश्न -1 से कैसे संबंधित है क्योंकि यह परीक्षण करना इतना आसान था, सिर्फ 1e6 फाइलें बनाएं और कमांड चलाएं।

1

चाहेंगे locate(और निश्चित रूप से updatedb) आप के लिए किसी भी मदद की हो सकता है?


1
updatedbका उपयोग करता है find
dave1010

@ dave1010, निश्चित रूप से, लेकिन यह पृष्ठभूमि में एक बार एक समय में ऐसा करता है, इसलिए यदि यह ओपी को स्वीकार्य है कि हर मिनट की तारीख तक जरूरी नहीं है, लेकिन शायद दिन में एक बार, तो एक शांत घंटे में अपडेट करें (या अक्सर अपडेटेड शेड्यूल करें लेकिन कम प्राथमिकता पर, जो कि वैसे भी होना चाहिए), फिर जो आप चाहते हैं उसे ढूंढने के लिए डिटेक्ट का उपयोग करना बहुत जल्दी है। इसलिए अहम सवाल यह है कि डीबी (या किसी अन्य प्रणाली के लिए सूचकांक) की तारीख तक कितनी होनी चाहिए।
asoundmove
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.