Как использовать locate с нечитаемым в мире домашним каталогом

Вы можете использовать две переменные для хранения имени файла и части для сравнения:

max=; f=; { for i in *.txt; do d="$(cut -d_ -f2 <<<"$i")"; \
  d_s="$(sed 's/\(..\)\(..\)/\2\1/' <<<"$d")"; \
    [ "$d_s" -gt "$max" ] && max="$d_s" && f="$i"; done ;} && echo "$f"
  • max содержит текущий максимум при обходе имен файлов

  • f содержит имя файла при обходе

  • cut берет второе поле, разделенное _

  • sed используется для замены месяца и года для сравнения

Пример:

$ ls -1                                                                                                                                                                      
foobar
Zmx_0316_control.txt
Zmx_0416_control.txt
Zmx_0716_control.txt

$ max=; f=; { for i in *.txt; do d="$(cut -d_ -f2 <<<"$i")"; d_s="$(sed 's/\(..\)\(..\)/\2\1/' <<<"$d")"; [ "$d_s" -gt "$max" ] && max="$d_s" && f="$i"; done ;} && echo "$f"
Zmx_0716_control.txt
1
03.06.2018, 13:19
2 ответа

La mayoría de las distribuciones se enviarán con las herramientas locatede findutils en un paquete junto con un script invocado desde crontab que se ejecutará updatedb como usuario none. Solo tiene que encontrar este script (, por ejemplo, :en Debian 9, está en/etc/cron.daily/locate)y adaptarlo para eliminar el manejo del usuario y cambiar el archivo de la base de datos. Entonces, al final, una forma básica podría reducirse a:

updatedb --output="$HOME/locatedb" --localpaths="$HOME"

Esto probablemente debería colocarse en un crontab.

Y el uso sería entonces:

locate --database="$HOME/locatedb" somefilepattern

tendrá que agregar más opciones si está utilizando montajes de red y desea indexarlos, etc.

Si tiene acceso root en su sistema y considera posibles problemas de seguridad/privacidad, puede simplificar su vida y usar las herramientas alternativasmlocateprobablemente disponibles también en la mayoría de las distribuciones, que se comportan exactamente como las herramientas de localización, excepto que indexe todo como raíz (, por lo que nunca fallará en indexar los directorios ilegibles del mundo )en una base de datos a la que el usuario no puede acceder directamente, pero use un comando de localización setuid / setgid que lo leerá y permitirá mostrar los resultados a un determinado usuario solo si este usuario pudo acceder a los resultados en primer lugar.

4
28.04.2021, 23:46

/usr/libexec/locate.updatedben mi sistema (una variante BSD )no parece tener las opciones que sugiere A.B. En cambio, lo hace:

: ${FCODES:=/var/db/locate.database}
: ${SEARCHPATHS:="/"}

Así que tuve que hacer esto:

export SEARCHPATHS=$HOME
export FCODES=$HOME/locatedb
/usr/libexec/locate.updatedb

Entonces:

$ locate -d ~/locatedb <pattern>

¿Hay alguna forma de evitar establecer variables de entorno en mi sistema?

0
28.04.2021, 23:46

Теги

Похожие вопросы