filesystem organization and synchronization

Table of Contents

1. filesystem organization and synchronization   project

1.1. Dolphin con tags y demás

Tiene que estar Baloo corriendo
https://community.kde.org/Baloo
https://community.kde.org/Baloo/Architecture
https://api.kde.org/frameworks/baloo/html/searching.html
Además para que funcione hay que mover a mano las tags en la parte de places, para que estén disponibles en ~/.local/share/user-places.xbel

baloosearch tag:project 2>&1 | grep -v Elapsed # Esto lo puede procesar fzf o rofi o lo que sea

Se pueden guardar estas búsquedas, son a nivel de sistema, y además crear links si hago click derecho>create new>link to location (url)
Tienes que quitar las tags de los archivos antes de borrarlos, si no se quedan colgando sin referencias y tienes que reindexar
Que no se sincronize con Syncthing es una feature, porque mantienes listas de proyectos distintas entre trabajo y casa

1.1.1. Sacar las tags sin balooctl

Están en /run/user/1000/kio-fuse-*/tags
Tienes que navegar a una etiqueta y abrir una terminal con F6 para que se cree el directorio

cd /run/user/1000/kio-fuse-*/tags
ls -l | tail -n +2 | awk '{ $1=$2=$3=$4=$5=$6=$7=$8=""; print $0}' | sed "s#$PWD##"

1.1.2. Tags jerárquicas

Si llamas a una tag tag1/tag2 se crea una jerarquía de tags, como si fuesen carpetas
Esto puede servir para implementar una interfaz en la que se crea la jerarquía sobre la marcha?

1.1.3. Utilizar tags key:value   project someday_20230330

Originalmente de How to Use Tags

1.1.4. Extended attributes: the good, the not so good, the bad. → Lack of support

Write a bash script that gets synced up that contains all the tags

1.1.6. Hacer un script de bash que genera todas las tags

Otra idea muy buena es también que cuando añades un directorio con tag repo te añada si no existe a ese script

1.1.7. Tags automáticas de git

sudo apt install attr
getfattr
setfattr

Encontrar todos los repos que no estan en ~/.config/repoignore

find . -iname ".git"  | sed 's/\.git//' | grep -v "$(cat ~/.config/repoignore)"

Tagear con “repo” todos los que cumplen estas condiciones

find . -iname ".git"  | sed 's/\.git//' | grep -v "$(cat ~/.config/repoignore)" | xargs -I _ setfattr -n user.xdg.tags -v repo "_"

Sacar los comandos de git clone para clonar todos los repos necesarios

find . -iname ".git" 2>/dev/null | sed 's/\.git//' | grep -v "$(cat ~/.config/repoignore)" | xargs -I _ bash -c 'cd _ && echo "git clone $(git remote get-url origin 2>&1) _"' | grep -v -e error -e fatal
#!/bin/bash

echo ".doom.d/org-html-themes
.zsh
.oh-my-zsh
.emacs.d
.config/emacs/
.cache/paru
.local/share/nvim
Downloads
.cargo/registry" > ~/.config/repoignore

cd ~
find . -iname ".git"  | sed 's/\.git//' | grep -v "$(cat ~/.config/repoignore)" | xargs -I _ setfattr -n user.xdg.tags -v repo "_"


cd ~/Work/1projects
find . -maxdepth 1 -mindepth 1 -type d | xargs -I _ setfattr -n user.xdg.tags -v project "_"
1.1.7.1. Antiguo

Encontrar todos los repos que no son subrepos (parte de un repo más grande, más arriba en el path)
No funciona del todo bien porque no encuentra algunos repos como los de ~/code/python/… por ejemplo

find . -iname "*.git" | xargs -I _ zsh -c 'curr="_"; curr=${${curr%/.git*}%/*}; while [ "." != "$curr" ]; do curr=${curr%/*}; if ls -l "$curr/.git" 2>/dev/null 1>/dev/null; break; done; if [ "." = "$curr" ]; then file=_; file=${file%/.git*}; echo $file; fi'

Tagear con “repo” todos los que cumplen estas condiciones

find . -iname "*.git" | xargs -I _ zsh -c 'curr="_"; curr=${${curr%/.git*}%/*}; while [ "." != "$curr" ]; do curr=${curr%/*}; if ls -l "$curr/.git" 2>/dev/null 1>/dev/null; break; done; if [ "." = "$curr" ]; then file=_; file=${file%/.git*}; echo $file; fi' | xargs -I _ setfattr -n user.xdg.tags -v repo "_"

Filtrar más con algún blacklist de cosas que no quiero que se consideren

find . -iname .git 2>/dev/null | sed "s/\.git//" | sed "s#./##"

1.1.8. Hacer una función que te devuelva las tags/links o lo que sea (recursivo / autoreferencial)

Así generas unos archivos mktags.sh que te extraen las tags y te las generan
Te las puede generar un archivos que se llame mkmktags.sh por ejemplo, en base a un archivo. Así lo que pretendo es:

Ejecuta compara la salida de mkmktags.sh con lo que hay en mktags.sh. Si coinciden los archivos (para esto puedo utilizar chezmoi por ejemplo, o hashes), entonces está todo bien.
Si no, tienes que ejecutar mktags.sh, y una vez hecho sí que debería de coincidir la salida de mkmktags.sh con lo que hay en mktags.sh

mkmktags.sh lo que hace es, en base a lo que hay en el sistema, te saca los comandos que van en mktags.sh, que son los comandos que al ser ejecutados crean las tags/links correspondientes en un sistema sin nada instalado

Idealmente tendría en cuenta lo que hay, y puedes definir en un archivo de configuración cuál es tu estado deseado, pero mkmktags.sh sigue siendo util

1.1.9. Format de query de Dolphin

Baloo tiene este que está documentado: https://api.kde.org/frameworks/baloo/html/searching.html
baloosearch 'tag:repo AND tag:musica'
Dolphin le añade alguna cosa más: baloosearch:?json={"includeFolder":"Documents","searchString":"some text" ... "some text" includeFolder:Documents type:Document.
Un ejemplo de queries que funciona en Dolphin son

baloosearch:?json=%7B%22searchString%22:%22tag:motos AND tag:repo%22%7D&title=Query Results from ''
baloosearch:?json=%7B%22searchString%22:%22tag:project OR tag:repo OR tag:motos%22%7D&title=Query Results from ''

https://github.com/KDE/dolphin/blob/8aa81a1dc7fa978d44d2c6397df270432df1506f/src/search/dolphinquery.cpp#L100-L145
https://invent.kde.org/frameworks/baloo/-/blob/master/src/lib/query.cpp#L326 → fromSearchUrl

Para crear una entrada tienes que irte a una query de una tag ya existente, Ctrl+F para abrir el buscador, y guardar la query, arriba a la izq. A partir de ahí ya existe en user-places.xbel y la puedes editar

1.1.10. FSQL (File System Query Language)

1.1.11. Cosas que no añadir

.cache/paru/clone/*
.local/share/paru-bin/
.local/share/nvim/site/pack/packer/start/*
.oh-my-zsh/
.oh-my-zsh/custom/themes/powerlevel10k/
.oh-my-zsh/custom/plugins/*
.cargo/registry/index/github.com-1ecc6299db9ec823/
.mozilla/firefox/8ct7a3n2.default-release/
.emacs.d/
.emacs.d/.local/straight/repos/*
.emacs.d/.local/straight/build-28.1/doom-snippets/
.zsh/plugins/zsh-system-clipboard/
Documents/backup_rpi/pi/orgzly-integrations/
Documents/backup_rpi/pi/raspberrypi/

1.1.12. DONE Hacer un .org de Documents

find Documents \( -iname "*pdf" -o -iname "*.epub" \) | sed "s/^/* /" | sort > ~/org/Documents.org

Me llena demasiado de ruido, y además no puedo poner lins persistentes.
Puedo generarme un hash que se igual a su ruta, o sólamente pillando el nombre para que sea independiente de la localización (pero puedo tener duplicados entonces)

:ID: 7421da71-bdd2-4a73-b470-cd4964f9d0ea

https://www.reddit.com/r/orgmode/comments/p9i2og/does_anyone_use_org_attach_a_lot/
También utilizar orgzly-integrations para tener todos los archivos accesibles como links de org mode
Quizás hacer una integración, primero org → sistema de archivos, y luego bidireccional, de las tags que tiene cada uno, para que sean accesibles desde org mode y kde

1.1.14. DONE fzf para tener los places/tags en un mismo sitio y poder acceder desde la terminal

# Navegación por places
directory=$(cat ~/.local/share/user-places.xbel | grep -F 'bookmark href="file:///' | sed -E 's#[ ]*<bookmark href="file://([^"]+)">#\1#' | fzf --multi --preview "ls '{1}'"); cd "$directory"
# Navegación por tags
tag=$(cat ~/.local/share/user-places.xbel | grep -F 'bookmark href="tags:/' | grep -vF ' <bookmark href="tags:/">' | sed -E 's#[ ]*<bookmark href="tags:/([^"]+)">#\1#' | fzf --multi --preview 'baloosearch tag:{1}'); directory=$(baloosearch tag:$tag | fzf --multi --preview "ls '{1}'"); cd "$directory"

1.2. Agrupar archivos por día de descarga

Igual que hace Windows
Quizás hacerlo en org mode?
https://github.com/alphapapa/taxy.el/blob/master/examples/diredy.el Ya lo hace, habría qye definirse uno que agrupe por fecha

Author: Julian Lopez Carballal

Created: 2024-09-15 Sun 04:24