Перейти к содержимому
miner7

where-is | Простой поиск файлов

Рекомендуемые сообщения

 

where-is.thumb.jpg.7b9dc3fd417daa49714d351091f1acbd.jpg

  Привет, мир! Мой первый пост на этом форуме, и первый скрипт, хоть сколько-то дописанный до конца) Для интереса было решено написать небольшую утилиту поиска. Алгоритм простой: рекурсивно перебирать все файлы, начиная с рабочей директории; если найдено совпадение с запросом - добавить в таблицу результатов. Буду благодарен за любую конструктивную критику)

  Установка:

Скрытый текст

pastebin get 6WM5ufWE /bin/where-is.lua

  Код: 

Скрытый текст

local fs = require("filesystem")
local shell = require("shell")

local args, opts = shell.parse(...)
local pwd = shell.getWorkingDirectory()

if #args < 1 then
	error("Not enough arguments")
end

if pwd ~= "/" then
	pwd = pwd.."/"
end


Queue = {}
Queue.__index = Queue

function Queue:new(firstValue)
	local obj = {firstValue, first = 1, last = 1}
	setmetatable(obj, self)
	return obj
end

function Queue:push(value)
	local last = self.last + 1
	self.last = last
	self[last] = value
end

function Queue:shift()
	local first = self.first
	if first > self.last then error("queue is empty") end
	local value = self[first]
	self[first] = nil
	self.first = first + 1
	return value
end


local queue = Queue:new(pwd)
local results = {}

while queue.last >= queue.first do
	local currentDir = queue:shift()
	for file in fs.list(currentDir) do
		local filePath = currentDir..file

		if string.find(file, args[1]) then
			results[#results+1] = filePath
		end

		if fs.isDirectory(filePath) and not string.find(file, "mnt") then
			queue:push(filePath)
		end
	end	
end

print("Found " .. #results .. " file(s)")
for i,v in ipairs(results) do
	print(" - "..v)
end

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

За изобретение велосипеда лайк.

 

А нужный функционал уже реализован утилитой find.lua в OpenOS:

find / --name=*find*

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

@eu_tomat , хех) Кроме того, я ещё и не знал про существование shell.resolve

Изменено пользователем miner7

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
3 минуты назад, miner7 сказал:

А им можно весь диск обойти?

Так при указании корневой директории в качестве стартового пути вся смонтированная файловая система и обходится. В моём примере так и задано.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в тему...

×   Вы вставили отформатированное содержимое.   Удалить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


×
×
  • Создать...