LINUX.ORG.RU

fselect 0.9.1

 , , , ,


3

3

fselect — это консольная утилита для поиска файлов с помощью выражений, напоминающих SQL. В некоторых случаях может заменить традиционный find и написание развесистых скриптов с его использованием.

Преимущества:

  • возможность создания сложных запросов с помощью скобок и операторов SQL
  • использование подзапросов для поиска и сравнения результатов сразу в нескольких директориях
  • множество функций (агрегации, статистические, работа с датой и временем и т.д.), заимствованных из SQL
  • поиск внутри zip-архивов
  • поиск с учетом .gitignore
  • поиск по ширине/высоте изображений, метаданных EXIF
  • поиск по метаданным MP3-файлов
  • поддержка расширенных файловых атрибутов в Linux
  • поиск по хэшам содержимого файлов
  • интерактивный режим
  • форматирование вывода в CSV, JSON и null-terminated строки

Релиз 0.9.1 ознаменовался расширенной поддержкой подзапросов в операторах IN и EXISTS. Таким образом, теперь стало возможным искать файлы и сравнивать результаты поиска сразу в нескольких директориях.

Пример запроса (поиск файлов формата Markdown из директории content, для которых не были сгенерированы соответствующие HTML-файлы в директории public):

SELECT path
  FROM /content AS content
 WHERE NOT EXISTS (
       SELECT * FROM /public AS public
       WHERE public.dir = content.dir AND public.name = CONCAT(content.filename, '.html')) 
   AND name = '*.md'

>>> Репозиторий проекта на GitHub



Проверено: hobbit ()
Последнее исправление: hobbit (всего исправлений: 1)

поиск файлов формата Markdown из директории content, для которых не были сгенерированы соответствующие HTML-файлы в директории public

Попробовал решить эту задачу стандартными утилитами и получилось довольно многословно и развесисто. Корректность не проверял.

comm -23 \
   <{
      find content -type f |
      grep '\.md$' |
      sed 's!^[^/]*!!' |
      sort
   } \
   <{
      find public -type f |
      sed -n '/\.md\.html$/ s/.....$//p' |
      sed 's!^[^/]*!!' |
      sort
   } |
sed 's!^!content/!'
kaldeon
()
Ответ на: комментарий от kaldeon

Ии выдал такое :)

comm -23 \
  <(find content -name "*.md" | sed 's|^content/||; s|\.md$|.html|' | sort) \
  <(find public -name "*.html" | sed 's|^public/||' | sort) | \
  sed 's|\.html$|.md|'

И много других вариантов. :)))

pethead
()

Навело на мыслю, а знает ли кто о проектах ФС, устроенной внутри как реляционная БД, представляющей иноды и иерархию как view, причем представимая и как объектное хранилище с тэгами, где классическая иерархия вторична, как в BTRON.

Хотя хз зачем это нужно, когда можно написать скрипт на tcl, складывающий информацию о файлах и директориях в sqlite в удобном виде, а там селектить не переселектить.

lealxe
()

Не каноничная новость, где в тексте указание, что утилита написана на расте? Чо как не растоман?)

ptah_alexs ★★★★★
()
Ответ на: комментарий от ptah_alexs

Он в тегах указал, заинтересованные уже оповещены

irton ★★★★★
()

И там, и там выглядит вырвиглазно. Иногда хочется просто быстрый интерактивный поиск, как в эксплорере. Для этого, конечно, нужны индексирующие службы, как в грамотно спроектированной десктопной системе.

seiken ★★★★★
()

А если таки нужна автоматизация, проще скрипт на питоне написать. Ещё и кроссплатформенно будет, а не эти юникс-вей портянки с седами.

seiken ★★★★★
()
Последнее исправление: seiken (всего исправлений: 1)

Меня больше интересует, почему на твоей аватарке 12.5 байт?

mord0d ★★★★★
()
Ответ на: комментарий от seiken

А про канонічный locate все благополучно забыли?

Не нужны для этого никакие "десктопные системы".

mord0d ★★★★★
()
Ответ на: комментарий от ptah_alexs

Он её начал писать когда ещё раст не пытались везде насильно присунуть (первая новость в 2018 году на лоре), так что выбор языка был не по фанатским причинам скорее всего.

firkax ★★★★★
()
Ответ на: комментарий от kaldeon

Не, надо модно-молодёжно:

mapfile -t md < <(basename -a content/*.md);\
mapfile -t htm < <(basename -a public/*.html);\
for f in "${md[@]}"; do
[[ ${htm[@]} == *${f%.*}* ]] || echo $f; done

🙂

papin-aziat ★★★★★
()

Это все примеры, а юзкейс-то какой? Пока все это выглядит как вещь в себе.

С поиском по содержимому неплохо gtags/global справляется, поиск по хэшам содержимого даже и не знаю кому кроме гита нужно, дубликаты файлов в разных местах редко когда нужно искать и, скорее всего, на хардлинки нарвёшься :)

gns ★★★★★
()
Ответ на: комментарий от seiken

Ну десктопные системы такое внутри себя хранят, выдавать «пользователям десктопа» такой интерфейс поиска, — так только над ними издеваться.

gns ★★★★★
()
Ответ на: комментарий от lealxe

Какое-то время назад я положил один git сервер, далее будет понятно чьей разработки, который внутри из себя представлял MSSQL кринж данных.

Всего-то надо было залить туда репозиторий на десять гигов.

a1ba ★★★
()
Ответ на: комментарий от kaldeon

Решить стандартными утилитами это воспользоваться make, вот решение от чатгпт:

# директории
CONTENT_DIR := content
PUBLIC_DIR  := public

# все markdown-файлы
MD_FILES := $(wildcard $(CONTENT_DIR)/*.md)

# соответствующие html-файлы
HTML_FILES := $(patsubst $(CONTENT_DIR)/%.md,$(PUBLIC_DIR)/%.html,$(MD_FILES))

# цель по умолчанию — сгенерировать недостающие HTML
all: $(HTML_FILES)

# правило генерации html из md
$(PUBLIC_DIR)/%.html: $(CONTENT_DIR)/%.md
	@mkdir -p $(PUBLIC_DIR)
	@echo "Generating $@ from $<"
	# 👉 здесь можно поставить свою команду:
	pandoc $< -o $@

# удобная цель для проверки
missing:
	@echo "Missing HTML files:"
	@for html in $(HTML_FILES); do \
		if [ ! -f $$html ]; then echo $$html; fi; \
	done

.PHONY: all missing

necromant ★★
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.