Archiv für den Monat: Juni 2014

Lokales Suchen auf einem Linux-System und Bereitstellen der Ergebnisse

Auf einem Samba-Laufwerk, welches auf einem Linux-Rechner liegt und für die Windows-Computer freigegeben wurde, liegen sehr viele Dateien vor. Statt aus dem Windows Explorer heraus zu suchen (was aufgrund des Netzwerks und des Samba-Dienstes selbst ziemlich langsam ist), wird durch das Erstellen eines Ordners eine Suche definiert.

Hierzu wird ein neuer Ordner „_search“ verwendet. Alle unter diesem Ordner erstellten Unterordner lassen das Linux-System automatisch lokal eine Suche nach dem Namen des Ordners ausführen. Die gefundenen Dateien werden per Softlink im Verzeichnis bereitgestellt. Für Windows erscheint es dann so, als ob die Dateien direkt unterhalb des Unterordners liegen.

Am besten in /etc/rc.local das Skript aufrufen, oder direkt einen neuen Dienst erstellen.

inotify.sh

#!/bin/bash
# This example uses ".jpg" files
SEARCHPATH="/var/smb/"
mkdir -p ${SEARCHPATH}/_search
inotifywait -mq -e moved_to -e create --format %f ${SEARCHPATH}/_search | while read FILE
do
	# Nur auf Verzeichnisse reagieren, nicht auf Dateien
	if [ -d "${SEARCHPATH}/_search/${FILE}" ]
	then
		if [ `expr "${FILE}" : ".*Neuer Ordner"` -ne 0 ] # Auch Abwandlungen hiervon
		then
			continue
		fi
		rm -f "${SEARCHPATH}/_search/${FILE}/"* # Falls umbenannt wurde
		rm -f "${SEARCHPATH}/_search/${FILE}/.ready"
		SEARCH=`echo "${FILE}" | sed s/\ /*/g`
		find ${SEARCHPATH}/ -wholename '${SEARCHPATH}/_search' -prune -o -type f -iname "*${SEARCH}*.jpg" -printf "ln --backup=t --suffix=\".bak\" -s \"%p\" \"${SEARCHPATH}/_search/${FILE}/\"\n" | sh
		cd "${SEARCHPATH}/_search/${FILE}"
		# Duplicates have wrong extensions. TODO: Do this for any filename?
		for bkp in "${SEARCHPATH}/_search/${FILE}/"*.~*; do mv "${bkp}" "${bkp/%\~/.jpg}"; done >;/dev/null 2>&1
		# Mark for Windows user when we've finished. (Only necessary if local system is really slow or data is huge)
		touch "${SEARCHPATH}/_search/${FILE}/.ready"
	fi
done