【问题标题】:Is there a way to get N oldest filenames in a directory without fetching all filenames (preferred in python or shell)有没有办法在不获取所有文件名的情况下在目录中获取 N 个最旧的文件名(在 python 或 shell 中首选)
【发布时间】:2020-01-30 13:34:00
【问题描述】:

我正在使用下面的代码来获取目录中的 json 文件名。

import glob
jsonFiles = glob.glob(folderPath+"*.json")

每秒会在目录中创建许多新的 json 文件(比如 100/s)。通常它工作正常,但没有时会卡住。文件很大 (~150000) 并且需要很长时间 (3 - 4 分钟) 才能检索文件名。这可能是因为传入速率较大(不确定)。

是否有任何替代方法可以使用 python 或 linux 命令获取文件名有效。 获取最旧的 1000 个文件名也可以。我不需要一次所有的文件名。

我遇到了以下 shell 命令:

ls -Art | head -n 1000

会有帮助吗?它是否首先列出所有文件名,然后检索 1000 条最旧的记录?提前致谢。

【问题讨论】:

  • 如何在不查看所有文件的情况下获取最旧的 N 个文件名?
  • 只是为了确定:仅此代码需要 3 - 4 分钟?只是 globbing,不获取文件年龄?
  • 您是否看到其他问题/答案stackoverflow.com/questions/8931099/quicker-to-os-walk-or-glob?即使是最慢的文件也需要大约 3 秒,大约有一百万个文件,所以我认为还有其他事情发生
  • 为了强化@RoadRunner 所说的内容,似乎您必须所有文件才能确定哪些是最旧的 - 所以这是最有可能导致的区域放缓。
  • @martineau 我在想也许linux默认以某种排序顺序存储文件(可能是名称/大小/创建时间戳/修改时间戳等),并且可能有一种方法可以检索前 N 个文件名不看所有

标签: python linux shell


【解决方案1】:

发现 scandir 很有用。

# Python version 2.x
import scandir
ds = scandir.scandir('./files/')
fileNames = []
count=0
for file in ds:
    count+= 1
    fileNames.append(file.name)
    if count==1000:
        break

# Python version 3.x
import os
ds = os.scandir('./files/')
...

这会在目录中提供 1000 个随机文件名,而无需查看所有文件名。如果我们不跳出循环,它将继续以随机顺序提供文件名(文件名一旦给出将不会重复)。

【讨论】:

    猜你喜欢
    • 2013-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-29
    • 1970-01-01
    • 1970-01-01
    • 2020-12-09
    • 2020-08-31
    相关资源
    最近更新 更多