シェルで多数のファイルを管理する方法は?

シェルで多数のファイルを管理する方法は?

$ls./dir_with_huge_amount_of_files/errors/

ディレクトリがUnixタイムスタンプのあるイメージでいっぱいであるとしましょう。これは、数ギガバイト以上の単位で測定される画像が多いことを意味します。このようなシェルコマンドは、ls何百万を超える画像を処理するように設計されていないため、オーバーフロー警告が表示されます。このように大量のファイルをどのように管理しますか?たとえば、中間の写真を探したい場合(名前のタイムスタンプと作成時間に基づいて)、組み込みの検索機能を提供するファイルシステムの種類はありますか?どのコマンドを使用しますか?ls私は快適で必要なフラグを持つ方法を試しましたが、非常に遅いか警告をfind生成するので、写真を事前に索引付けするには、より良いファイルシステム、データベース、または同様のものが必要だと思います。デフォルトでは、写真のインデックスノードを時系列に配置する必要がある配列が必要です。どうすればいいですか?後でUnixタイムスタンプを含むメタデータを追加できます。

【書き直す】

現在の回答には重大な欠陥があります。人々は経験的なテストなしでランク付けされた答えを投稿します。推奨事項をテストすると失敗する可能性があります。だから私はサンドボックスを作成して多数のファイルを作成し、提案をテストするためのコマンドラインツール(例:1e7ファイルの数)を作成しました。ファイルの生成に時間がかかる場合がありますので、お待ちください。これを行うより高速な方法を知っている人がいる場合は、コードを編集してください。助けを得るために入力してくださいpython code.py --help。楽しくお過ごしください!

複数のディレクトリファイルを生成する使用例

$ 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

CodetestFill.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()

ベストアンサー1

別の殻を試してみてください。試してみることをお勧めします扱いにくいたとえば、より多くのパラメータを許可していることを確認してください。

私が正しく理解した場合、ファイル名の一部はUNIXタイムスタンプです。ファイルをフォルダに分割することをお勧めします。日付/時刻形式がUNIX epoch番号の場合は、数値の小数部(10000など)を別のフォルダに配置します。

もしISO 8601タイムスタンプはファイル名の一部であり、単に年、月、または日に分けられます。

おすすめ記事