Autor Thema: Endlich! Terminal: schnell Ordner finden  (Gelesen 132 mal)

0 Mitglieder und 1 Gast betrachten dieses Thema.

Offline m-bostaurus

  • Sr. Mitglied
  • ****
  • Beiträge: 384
  • Dankeschön: 5 mal
  • Karma: +0/-0
  • Desktop: KDE, XFCE, LXQt, Mate
  • Grafikkarte: Desktop: GTX 1070Ti; Laptop: Nvidia
  • Grafikkartentreiber: unfree; unfree
  • Kernel: 419/420 64bit auf beiden Rechnern
  • Prozessor: i5-6500; i5
  • Skill: Durchschnitt
  • Zweig: stable
Endlich! Terminal: schnell Ordner finden
« am: 03. März 2021, 10:58:44 »
Auf der Suche nach komfortablen Möglchkeiten des Arbeitens mit einem Terminal oder der KDE-Konsole bin ich auf ein Script gestoßen, mit dem ich meinen Rechner schnell nach einem bestimmten Ordner durchsuchen und in ihn wechseln kann. Wenn es mehrere gleichlautende Verzeichnisse gibt, erhalte ich einen Überblick und kann den gesuchten anwählen.
Die Quelle des Scripts ist https://demystifikation.wordpress.com/2021/03/03/fcd-fast-cd-version-1-1/
Der Code ist: #!/bin/bash
#
# fcd.sh:
#
# Fast change directory. Should be sourced from ~/.bashrc file, since it is and
# needs to be a function.
#
# Update Ver.1.1, 2021-03-03
# Bugfix for missing results when fast changing to "bin", thanks to m_bostaurus.
# Update Ver.1.0, 2021-02-07
# changed from egrep to mapfile, see code. Handles blanks in paths now flawlessly.
#   Update Ver.0.9, 2013-08-21, comments, publication
#
#   Prototyp 2010
#
# This program depends on locate/updatedb, which aren't always installed/activated.
# If you use the shell on a regular basis, you should have them installed, though.
#
# (c) GPLv3 (2010, 2021)
#
fcd ()
{
suchdirname=$1
# list=$(locate $1 | egrep "/$1$"); # Version 1
    # update 12.02.2021
    # mapfile -d '' list < <(locate -b -0 -r "$suchdirname$")
    # update 19.02.2021
    mapfile -d '' list < <(locate -b -0 -r "^$suchdirname$")
    # count=$(echo $list | wc -w );
    # update 19.02.2021
    count=${#list[@]}
    case $count in
        0)
            echo "unknown directory: "$1 && return
            # could search for partial matches Doc => Documentation
        ;
        1)
            if [[ -d "${list[0]}" ]]; then
                echo "1) match: $list";
                cd "$list";
            else
                echo "not a directory: $1";
            fi
        ;
        *)
            select directory in "${list[@]}" "/exit/";
            do
                if [[ "$directory" = "/exit/" ]]; then
                    break;
                fi;
                if [[ -d "$directory" ]]; then
                    echo "multi) $directory";
                    cd "$directory";
                    break;
                else
                    echo "not a directory: "$1;
                fi;
            done
        ;
    esac
}

Zur Einrichtung bin ich folgende Schritte gegangen:
  • a) Ich habe den Code in eine Datei namens fcd.sh in ~/.local/bin/ geschrieben und ausführbar gemacht.
  • b) In die Datei ~/.bashrc fügte ich die Zeile source /Speicherort/bin/fcd.sh ein. Die Änderung dieser Datei wird erst nach Ab- und Anmelden des Users wirksam.
  • c) Ich installierte m-locate mittels sudo pacman -S m-locate
  • d) Ich änderte die durch die Installation entstandene Datei /etc/updatedb.conf; sie enthält eine Zeile, die mit PRUNEPATH beginnt. In ihr wird festgelegt, wo nicht gesucht wird für die Erstellung der Datenbank. In der steht regulär z. Bsp. /media oder auch /mnt. Nach dem Löschen dieser Angabe, dem Speichern und einem nachfolgenden sudo updatedb werden Ordner an diesen Orten zuverlässig gefunden.
    Auf S. 47 in LinuxWelt 1/2021 fand ich übrigens einen Hinweis für diejenigen, die auch USB-Laufwerke scannen wollen. In der genannten Datei gibt es auch eine Zeile, beginnend mit PRUNEFS. In dieser muss man usbfs löschen. Danach werden auch USB-Laufwerke für die Erstellung der Datenbank gescannt.
  • e) Im Terminal gebe ich nach Aus- und Einloggen zum Beispiel ein: fcd Dokumente und erhalte eine Liste mit allen Ordnern meiens Rechners, die so heißen ... und verschollen geglaubte Verzeichnisse habe ich auch schon wiedergefunden ...
Mein Dank geht an user unknown von https://demystifikation.wordpress.com  :)
Dieser Hinweis wird von mir auf folgenden Foren veröffentlicht: https://forum.manjaro.org/ (englisch), https://www.manjaro-forum.de/ und https://de.manjaro.org/

Offline m-bostaurus

  • Sr. Mitglied
  • ****
  • Beiträge: 384
  • Dankeschön: 5 mal
  • Karma: +0/-0
  • Desktop: KDE, XFCE, LXQt, Mate
  • Grafikkarte: Desktop: GTX 1070Ti; Laptop: Nvidia
  • Grafikkartentreiber: unfree; unfree
  • Kernel: 419/420 64bit auf beiden Rechnern
  • Prozessor: i5-6500; i5
  • Skill: Durchschnitt
  • Zweig: stable
Re: Endlich! Terminal: schnell Ordner finden
« Antwort #1 am: 05. März 2021, 17:56:27 »
Korrektur zu oben: Die Semikolons, die case betreffen, müssen doppelt sein. Und das Paket heißt mlocate ...
#!/bin/bash
#
# fcd.sh:
#
# Fast change directory. Should be sourced from ~/.bashrc file, since it is and
# needs to be a function.
#
#   Update Ver.1.1, 2021-03-03
#       Bugfix for missing results when fast changing to "bin", thanks to m_bostaurus.
#   Update Ver.1.0, 2021-02-07
#       changed from egrep to mapfile, see code. Handles blanks in paths now flawlessly.
#   Update Ver.0.9, 2013-08-21, comments, publication
#
#   Prototyp 2010
#
# This program depends on locate/updatedb, which aren't always installed/activated.
# If you use the shell on a regular basis, you should have them installed, though.
#
#   (c) GPLv3 (2010, 2021)
#
fcd ()
{
    suchdirname=$1
    # list=$(locate $1 | egrep "/$1$"); # Version 1
    # update 12.02.2021
    # mapfile -d '' list < <(locate -b -0 -r "$suchdirname$")
    # update 19.02.2021
    mapfile -d '' list < <(locate -b -0 -r "^$suchdirname$")
    # count=$(echo $list | wc -w );
    # update 19.02.2021
    count=${#list[@]}
    case $count in
        0)
            echo "unknown directory: "$1 && return
            # could search for partial matches Doc => Documentation
        ;;
        1)
            if [[ -d "${list[0]}" ]]; then
                echo "1) match: $list";
                cd "$list";
            else
                echo "not a directory: $1";
            fi
        ;;
        *)
            select directory in "${list[@]}" "/exit/";
            do
                if [[ "$directory" = "/exit/" ]]; then
                    break;
                fi;
                if [[ -d "$directory" ]]; then
                    echo "multi) $directory";
                    cd "$directory";
                    break;
                else
                    echo "not a directory: "$1;
                fi;
            done
        ;;
    esac
}