$ ls ./dir_with_huge_amount_of_files/errors/
Misalkan direktori penuh dengan gambar dengan cap waktu unix, maksud saya banyak diukur dalam banyak GB atau bahkan lebih. Perintah Shell seperti ls
akan mendapatkan peringatan gaya meluap karena mereka tidak dirancang untuk bekerja dengan jutaan (atau lebih) gambar. Bagaimana saya bisa mengatur jumlah file yang begitu besar? Jika, misalnya, saya ingin menemukan gambar di tengah (sesuai stempel waktu dalam nama dan waktu pembuatan), apakah ada beberapa sistem file yang menawarkan fitur pencarian bawaan? Perintah mana yang akan Anda gunakan? Saya mencoba yang nyaman ls
danfind
dengan flag yang diperlukan tetapi peringatannya lambat atau menghasilkan peringatan jadi saya berpikir bahwa saya perlu sistem file atau db yang lebih baik atau sesuatu seperti itu untuk mengindeks gambar. Saya pada dasarnya memerlukan satu larik yang inode foto harus ditempatkan dalam urutan kronologis. Bagaimana cara melakukannya? Kemudian, metadata dengan cap waktu unix dapat ditambahkan.
[Memperbarui]
Ada kesalahan serius dalam jawaban saat ini, orang hanya memposting semacam-jawaban tanpa tes empiris. Jika mereka menguji saran mereka, mereka mungkin akan gagal. Oleh karena itu, saya membuat Anda alat baris perintah di mana Anda dapat membuat kotak pasir untuk membuat sejumlah besar file dan menguji saran Anda seperti dengan jumlah file 1e7. Butuh waktu lama untuk menghasilkan file jadi bersabarlah. Jika seseorang tahu cara yang lebih cepat untuk melakukan ini, harap edit kode. Ketik python code.py --help
untuk mendapatkan bantuan. Selamat bersenang-senang!
Contoh Penggunaan untuk membuat banyak file yang 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
Kode 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()
sumber
a/b/abcdef.jpg
Jawaban:
Coba shell yang berbeda. Saya akan merekomendasikan mencoba zsh misalnya, dan lihat apakah itu memungkinkan lebih banyak parameter.
Jika saya mengerti dengan benar, bagian dari nama file, adalah cap waktu UNIX. Mungkin disarankan, untuk membagi file ke dalam folder. Jika format tanggal / waktu adalah nomor zaman UNIX, masukkan bilangan pecahan dari angka itu, misalnya 10.000, dalam folder terpisah.
Jika stempel waktu ISO 8601 adalah bagian dari nama file, cukup bagi dengan tahun, bulan atau hari.
sumber
"$ 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 "
. Maaf tapi saya tidak bisa melihat bagaimana ini terkait dengan pertanyaan -1 karena sangat mudah untuk menguji ini, buat hanya file 1e6 dan jalankan perintah.Apakah
locate
(dan tentu sajaupdatedb
) dapat membantu Anda?sumber
updatedb
menggunakanfind
.