[Xubuntu] Wie sucht man richtig?

Crys

Lt. Commander
Registriert
Apr. 2009
Beiträge
1.634
Ich verwende seit einigen Monaten Xubuntu 14 LTE, aber bekomme das mit der Datei-/Ordner-Suche immer noch nicht hin.
Bei der Suche komme ich immer wieder auf Catfish. Und wenn ich in der Hilfe nach schaue steht da nur, dass das ganz intuitiv funktioniert.

Wenn ich aber in einem Verzeichnis "/freigaben/" nach "*.*" (jeweils immer ohne Anführungszeichen) suche, dann kommt als Ergebnis: "keine Datei gefunden".

Auch wenn das vielleicht soo offensichtlich ist, kann mir jemand weiter helfen?
Danke :)
 
Suche doch mal nach "*".
 
Hat dieses Ding wirklich keine Dokumentation, die erklärt, wie * und ggf. andere Sonderzeichen interpretiert werden?
 
rudl schrieb:
"Keine Dateien gefunden"

Photon schrieb:
Vielleicht hilft es schon, die Suchdatenbank zu aktualisieren (entweder mit "sudo updatedb" oder etwas versteckt in den Catfish-Einstellungen unter "Zahnrad">Suchindex aktualisieren).
Hat leider nichts geändert. Bei "*" findet der ja was, also liegt es wohl nicht an der DB!?

mensch183 schrieb:
Hat dieses Ding wirklich keine Dokumentation, die erklärt, wie * und ggf. andere Sonderzeichen interpretiert werden?
Ich kann leider wirklich nichts finden.

"Catfish ist ein grafisches Frontend für verschiedene Suchdienste. Das Programm gestattet es, schnell und unkompliziert auf der Festplatte nach Dateien und Ordnern zu suchen. Das Programm ist intuitiv zu bedienen. Nützlich ist die Eingrenzung der Suchergebnisse nach Dateitypen, z.B. nach Bilddateien." [http://wiki.ubuntuusers.de/Catfish]
 
Wer hat Angst vor der shell?

Code:
find ${PWD} -iname ${REGEX_MUSTER} -type f -ls -exec echo {} \;

kann man auch der .bashrc unter einem griffigen Kürzel hinzufügen, wenn man es mal öfters bräuchte.

Ach ja:
$PWD ist das aktuelle Arbeitsverzeichnis.
$REGEX_MUSTER wäre für *.mkv etwa "\.mkv$". da der Punkt eigentlich wildcard ist, braucht's ein escape.
der Befehl durchsucht auch Unterverzeichnisse, und sucht nach Einträgen vom Typ "file".
Näheres zu "find" liefert "man find".
 
Zuletzt bearbeitet: (edit: Erläuterung des Befehles)
Twostone schrieb:
Wer hat Angst vor der shell?
Ich :)
Ich möchte die Dateien nicht nur gelistet haben, sondern möchte die dann (am liebsten per Drag and Drop) z.B. verschieben ...

@ Photon:
Da findet der dann auch was, aber ich möchte ja explizit nach dem mkv-Präfix suchen.
Sonst würde ich bei avi ja auch nicht nur avi-Dateien angezeigt bekommen, sondern auch den Aviator ;)
 
Crys schrieb:
sondern möchte die dann (am liebsten per Drag and Drop) z.B. verschieben ...

Auch dies ließe sich bequem per shell-script lösen. Willst Du nach Dateiendungen sortieren? Dateityp? Datum?
 
Crys schrieb:
Ich :)
Da findet der dann auch was, aber ich möchte ja explizit nach dem mkv-Präfix suchen.
Sonst würde ich bei avi ja auch nicht nur avi-Dateien angezeigt bekommen, sondern auch den Aviator ;)

Funktioniert es denn nicht wenn du nur nach ".mkv" suchst?

Ansonsten habe ich mal nach "Thunar Wildcard" gegooglet.
Ich gehe davon aus, dass dein Dateimanager Thunar ist und du dort die Suche durchführen willst.
Im ersten Treffer steht folgendes:
you can forget about wildcard searches
Allerdings ist dieser Artikel von 2009. Weiß nicht ob der noch aktuell ist.
 
So, jetzt habe ich mir mal die Mühe gemacht die Mans von locate zu lesen. :) locate braucht die Option --regex, die die Verwendung von regulären Ausdrücken steuert. Ob locate von catfish mit oder ohne dieser Option aufgerufen wird, müsste man recherchieren. Speziell für Dateiendungen bietet catfish aber eine entsprechende Option: http://dl.dropbox.com/u/1507406/Catfish_21-09-2014_09:54:10.png
 
Suchen war auch eine der größten Hürden für mich, als ich in Linux eingestiegen bin. Ich rate inzwischen auch nur noch zu find und wenn du weiterverarbeiten willst, dessen exec-Parameter. Alles andere ist nur Fummelei.
 
Tumbleweed schrieb:
Alles andere ist nur Fummelei.

Die bash (und auch zsh) ist ziemlich komfortabel, wenn man die Möglichkeiten, die einem die Skriptsprachen sowie z.B. auch die .bashrc dann auch ausschöpft, man kann sich das Leben damit wirklich extrem einfach gestalten. Klar, manche Aufgaben sind per GUI anfangs noch leichter und intuitiver zu lösen, jedoch automatismen und komplexere Vorgänge, vor allem spezifische, ungewöhnlichere Aufgabenstellungen lassen sich meines Erachtens dann doch leichter per shell-skript lösen.
Die bash bringt in den meisten Distros schon standardmäßig eine Menge mächtiger tools mit, und für remote admin ist die shell sowieso das nonplusultra.

Die Kombi zwischen shell und GUI machts. Daher sind tools wie terminator, yakuake und ggf. screen (für remote-Maschinen) eigentlich schon fast Pflicht, wie auch ein guter Editor wie geany (und ggf. nano als einfachere vi-Alternative).

Meine .bashrc (und die darin referenzierten Skripte) wächst schon seit Jahren stetig, und auch wenn sich sehr viel cruft angehäuft hat, nutze ich diese Überbleibsel immer noch als Nachschlagewerk für komplexere Aufgaben, und baue vorhandenes auch weiter aus. Wer mit Linux arbeiten will, sollte sich auch mit der shell auseinandersetzen, sonst entgeht ihm sehr viel Komfort und viele Möglichkeiten zur Automatisierung von Vorgängen.
 
Photon schrieb:
Ob locate von catfish mit oder ohne dieser Option aufgerufen wird, müsste man recherchieren.

Aus CatfishSearchEngine.py:
Code:
class CatfishSearchMethod_Locate(CatfishSearchMethodExternal):
    """External Search Method utilizing the system command 'locate'."""
    def __init__(self):
        """Initialize the Locate SearchMethod."""
        CatfishSearchMethodExternal.__init__(self, "locate")
        self.command = ["locate", "-i", "%path*%keywords*", "--existing"]

    def assemble_query(self, keywords, path):
        """Assemble the search query."""
        return ["locate", "--regex", "-i", "{}".format(string_regex(keywords,
                                                                    path))]

:)
 
Twostone schrieb:
Meine .bashrc (und die darin referenzierten Skripte) wächst schon seit Jahren stetig, und auch wenn sich sehr viel cruft angehäuft hat, nutze ich diese Überbleibsel immer noch als Nachschlagewerk für komplexere Aufgaben, und baue vorhandenes auch weiter aus. Wer mit Linux arbeiten will, sollte sich auch mit der shell auseinandersetzen, sonst entgeht ihm sehr viel Komfort und viele Möglichkeiten zur Automatisierung von Vorgängen.

Zwar etwas OT aber könnte man die sehen, deine "dotfiles" oder nur die bashrc?
 
neo253 schrieb:
Zwar etwas OT aber könnte man die sehen, deine "dotfiles" oder nur die bashrc?

Nur Auszüge, denn es sind auch Adressen und Nutzernamen drin enthalten sowie Verweise auf Zertifikate etc.

Aber hier ein paar nützliche Sachen:

Code:
##blättern durch die History mit Pfeilauf/pfeilab, Ergänzung zu bash-completion
export HISTCONTROL=$HISTCONTROL${HISTCONTROL+,}ignoredups
export HISTCONTROL=erasedups
export HISTSIZE=500
export PROMPT_COMMAND="history -a"
bind '"\e[A"':history-search-backward
bind '"\e[B"':history-search-forward
shopt -s histappend 
##

## duplicate dir (lokales Netzwerk, unverschlüsselt)
send(){ ##für die Quelle
if [ -z $1 ]; then
    echo "Ich brauche ein Quellverzeichnis!"
else
    if [ ! -d $1 ]; then
        echo "Verzeichnis existiert nicht!"
    else
        echo "sende..."
        tar -cf - $1 | pigz -9 | mbuffer -s 4k -m 12G -O ${ZIEL}:${PORT}
    fi
fi
}

recv(){ ##für das Ziel
if [ -z $1 ]; then
    echo "Ich brauche ein Zielverzeichnis!"
else
    if [ ! -d $1 ]; then
        echo "Verzeichnis existiert nicht!"
    else
        if [[ "$(ls -A $1)" ]] && [[ ! "$2" = "!" ]] ; then
            echo "Verzeichnis $1 ist nicht leer!"

        else
            OLDDIR=$PWD
            cd $1
            echo "empfange..."
            mbuffer -s 4k -m 12G -I ${PORT} | unpigz | tar -xf -
            cd ${OLDDIR}
        fi
    fi
fi
}
## 

## Adblock Listen konvertieren für squid
squidblock(){ 
PATTERN="/scripts/adblock-pattern.sed" #Ausdrücke für sed
    if [ -z $1 ]; then
        wget --no-check-certificate https://easylist-downloads.adblockplus.org/easylist.txt
        cat easylist.txt | sed -f ${PATTERN} >>filterlist.txt
    else
        cat $1 | sed -f ${PATTERN} >>filterlist.txt
    fi
}
##

##.mts/.mkv in mp4 umkodieren
videoconvert(){ 
if [ ! -d "${PWD}/converted" ]; then
  # directory does not exist
  if $(ls |egrep -icq "\.mts$|\.mkv$"); then
    mkdir ${PWD}/converted
  else
    echo "no .mts files in this dir."
  fi
fi
if [ -L "${PWD}/converted" ]; then
    # It is a symlink!
    echo '"./converted" is a symlink. Conversion aborted.'
    return 1
else
SAVEIFS=$IFS
IFS=$(echo -en "\n\b")
    for FILE in $(ls |egrep -i "\.mkv$|\.mts$"); do
        ffmpeg -report -hwaccel auto -i $FILE -acodec libfaac -ab 128k -ac 2 -vcodec libx264 -crf 25 -threads 8 -deinterlace -profile high ./converted/$(ls -al --time-style="+%Y%m%d_%H%M" ${FILE} | awk '{print $6}')-${FILE%.*}.mp4
    done
IFS=$SAVEIFS
fi
}
##

##
discover(){ # entdeckt mit dem Netzwerk verbundene Geräte
    if [ $(cat /proc/net/route | awk '{ if ( $1!="lo" ) if ( $1!="Iface" ) print $1 }' | uniq | wc -l) = "0" ]; then
        echo "Kein interface aktiv."
    else
        if [ -z "$1" ]; then
            if [ $(cat /proc/net/route | awk '{ if ( $1!="lo" ) if ( $1!="Iface" ) print $1 }' | uniq | wc -l) = "1" ]; then
                echo ""
                echo "Sie haben zur Zeit nur ein Interface aktiv."
                echo "Lausche auf: $(cat /proc/net/route | awk '{ if ( $1!="lo" ) if ( $1!="Iface" ) print $1 }' | uniq)"
                echo -n "Taste drücken, um zu beginnen..."
                read -n 1 s
                IFACE=$(cat /proc/net/route | awk '{ if ( $1!="lo" ) if ( $1!="Iface" ) print $1 }' | uniq)
            else
                echo ""
                echo "Sie haben folgende NICs aktiv:"
                echo ""
                NICS=$(cat /proc/net/route | awk '{ if ( $1!="lo" ) if ( $1!="Iface" ) print $1 }' | uniq | sort -bf)
                for NIC in $NICS; do
                    echo "   $NIC"
                done
                echo ""
                echo -n "Auf welchem Interface möchten Sie lauschen?: "
                read IFACE
                IFACE=$( echo $IFACE |tr [A-Z] [a-z] )
                if [ -z "$IFACE" ]; then
                    echo "Abgebrochen."
                    break
                    return 1
                fi
                if ! ( echo $NICS | grep -icq "$IFACE" ); then
                    echo "Interface existiert nicht oder ist nicht aktiv."
                    break
                    return 1
                fi
                unset NIC
                unset NICS
            fi
            if ( ifconfig $IFACE | grep -icq "Adresse" ); then
                ADDY=$( ifconfig $IFACE |grep "inet " |awk '{ print $2 }' | sed -e s/Adresse:// )
            else
                ADDY=$( ifconfig $IFACE |grep "inet " |awk '{ print $2 }' | sed -e s/addr:// )
            fi
            if [ -z ADDY ]; then
                ADDY="(none)"
            fi
        else
            if ! ( cat /proc/net/route | grep -icq "$1" ); then
                IFACE="$1"
                if ( ifconfig $IFACE | grep -icq "Adresse" ); then
                    ADDY=$( ifconfig $IFACE |grep "inet " |awk '{ print $2 }' | sed -e s/Adresse:// )
                else
                    ADDY=$( ifconfig $IFACE |grep "inet " |awk '{ print $2 }' | sed -e s/addr:// )
                fi
                if [ -z ADDY ]; then
                    ADDY="(none)"
                fi
            else
                echo "Interface existiert nicht!"
                break
                return 1
            fi
        fi
        sudo netdiscover -i $IFACE -r ${ADDY%.*}.0/24 -n 111
        unset IFACE
        unset ADDY
    fi
}
##

##
addy(){ # gibt die Adresse der NIC aus
    if [ -z "$1" ]; then
        echo "Bitte Interface angeben."
    else
        if ( cat /proc/net/route | grep -icq "$1" ); then
            if ( ifconfig $1 | grep -icq "Adresse" ); then
                ADDY=$( ifconfig $1 |grep "inet " |awk '{ print $2 }' | sed -e s/Adresse:// )
            else
                ADDY=$( ifconfig $1 |grep "inet " |awk '{ print $2 }' | sed -e s/addr:// )
            fi
            if [ -z "$ADDY" ]; then
                ADDY="(none)"
            fi
            echo "Interface: $1"
            echo "Addresse:  $ADDY"
        else
            echo ""
            echo "Interface ist nicht aktiv oder existiert nicht."
            echo ""
            return 1
        fi
    fi
}
##

##
filecopy(){ ##Kopiert Dateien aus einer Liste in das angegebene Zielverzeichnis
SAVEIFS=$IFS
IFS=$(echo -en "\n\b")
cp $(cat $1) $2
IFS=$SAVEIFS
}
##

##
playlistgain(){ ##Berechnet Gain für Dateien einer Playlist
if [ -z "$1" ] || [ ! -f $1 ]; then
    echo "Kein gültiges Playlistfile angegeben."
    echo ""
    echo "Syntax:"
    echo ""
    echo 'playlistgain ${PLAYLISTFILE}'
    echo ""
else
    ERROR_MP3="0"
    ERROR_MP4="0"
    ERROR_FORMAT="0"
    NONEXISTENT="0"
    NUM_FILES="0"
    NUM_MP3="0"
    NUM_MP4="0"
    TOTAL=$(wc -l $1)
    SAVEIFS=$IFS
    IFS=$(echo -en "\n\b")
    for FILE in $(cat $1); do
        if [ ! -f $FILE ]; then
            echo "!!! ${FILE} existiert nicht. !!!"
            NONEXISTENT=$(( ${NONEXISTENT} + 1 ))
            NUM_FILES=$(( ${NUM_FILES} + 1 ))
            echo ""
            echo -e "\r${NUM_FILES} von ${TOTAL}"
        else
            if [ $(echo ${FILE: -4} | tr [:upper:] [:lower:]) == ".m4a" ];then
                aacgain -q -s d ${FILE} >>/dev/null
                aacgain -q -r -k -s r ${FILE} >>/dev/null
                if [ $? -ne 0 ]; then
                    echo "!!! mp4 Fehler bei ${FILE} !!!"
                    echo ""
                    ERROR_MP4=$(( ${ERROR_MP4} + 1 ))
                fi
                NUM_FILES=$(( ${NUM_FILES} + 1 ))
                NUM_MP4=$(( ${NUM_MP4} + 1 ))
                echo -e "\r${NUM_FILES} von ${TOTAL}"
            else
                if [ $(echo ${FILE: -4} | tr [:upper:] [:lower:]) == ".mp3" ];then
                    mp3gain -q -s d ${FILE} >>/dev/null
                    mp3gain -q -r -k -s r ${FILE} >>/dev/null
                    if [ $? -ne 0 ]; then
                        echo "!!! mp3 Fehler bei ${FILE} !!!"
                        echo""
                        ERROR_MP3=$(( ${ERROR_MP3} + 1 ))
                    fi
                    NUM_FILES=$(( ${NUM_FILES} + 1 ))
                    NUM_MP3=$(( ${NUM_MP3} + 1 ))
                    echo -e "\r${NUM_FILES} von ${TOTAL}"
                else
                    echo "nicht unterstütztes Format: ${FILE}"
                    echo""
                    ERROR_FORMAT=$(( ${ERROR_FORMAT} + 1 ))
                    NUM_FILES=$(( ${NUM_FILES} + 1 ))
                    echo -e "\r${NUM_FILES} von ${TOTAL}"
                fi
            fi
        fi
    done
    #clear
    echo ""
    echo "Zusammenfassung"
    echo ""
    echo "Dateien:"
    echo ""
    echo "Gesamt:           ${NUM_FILES}"
    echo "Bearbeitet:       $(( ${NUM_FILES} - ${NONEXISTENT} - ${ERROR_MP3} - ${ERROR_MP4} - ${ERROR_FORMAT} ))"
    echo "MP3:              ${NUM_MP3}"
    echo "MP4:              ${NUM_MP4}"
    echo ""
    echo "Fehler: "
    echo ""
    echo "Gesamt:           $(( ${NONEXISTENT} + ${ERROR_MP3} + ${ERROR_MP4} + ${ERROR_FORMAT} ))"
    echo "Codecfehler:      ${ERROR_FORMAT}"
    echo "Fehlende Dateien: ${NONEXISTENT}"
    echo "MP3:              ${ERROR_MP3}"
    echo "MP4:              ${ERROR_MP4}"
    unset ERROR_MP3
    unset ERROR_MP4
    unset NONEXISTENT
    unset ERROR_FORMAT
    unset NUM_FILES
    unset NUM_MP4
    unset NUM_MP3
    IFS=$SAVEIFS
fi
}
##

##
copy(){ ## kopiert Dateien aus Unterverzeichnissen, die dem Muster entsprechen, ins Zielverzeichnis
    if ! [ -z "$1" ] && ! [ -z "$2"]; then
        find $PWD -iname $1 -type f -ls -exec cp {} $2 \;
    else
        echo ""
        echo "usage:"
        echo '   copy $pattern $destination'
        echo ""
        echo 'searches for $pattern in current working directory and its subdirectories'
        echo '$pattern is regex.'
        echo '$destination should be the full path.'
        echo ""
        echo "example:"
        echo '   copy \.doc$ /home/user/docs'
        echo "      searches for any file with the extension .doc recursively starting with current directory."

    fi
    return 0
}
##

##
suche(){ ## Dateisuche
    if ! [ -z "$1" ]; then
        find $PWD -iname $1 -type f -ls -exec echo {} \;
    else
        echo ""
        echo "usage:"
        echo '   suche $pattern'
        echo ""
        echo 'searches for $pattern in current working directory and its subdirectories'
        echo '$pattern can be regex.'
        echo ""
        echo "example:"
        echo '   suche \.doc$'
        echo "      searches for any file with the extension .doc recursively starting with current directory."
    fi
    return 0
}
##

##wine
wineprio(){ ##Verteile Wine-Prozesse auf alle Kerne
for PROCESS in $(lsof |grep wine |awk '{ print $2 }'|uniq); do
    taskset -p ff $PROCESS
done
}

winekill(){ ##Töte Wine-Prozesse
for PROCESS in $(lsof |grep wine |awk '{ print $2 }'|uniq); do
    kill -9 $PROCESS
done
}
##

##chroot replacement
rootch(){

[ -z "$1" ] && echo "Directory for chroot missing." && exit 1
[ ! -e "$1" ] && echo "Directory does not exist" && exit 1

echo "Mounting Home Drive."
mount -o bind /home $1/home

#Mount Operating system devices.

echo "Mounting System Devices."
mount -o bind /proc $1/proc
mount -o bind /dev $1/dev
mount -o bind /sys $1/sys
mount -t devpts devpts $1/dev/pts

#Enable Network Access.

echo "Enabling Network Access."
mv $1/etc/resolv.conf $1/etc/resolv.conf.old
cp /etc/resolv.conf $1/etc/resolv.conf

#Enter the Chroot Environment.

echo "Entering the chroot environment."
env NAME=chroot chroot $1 /bin/bash

#Clean up after exiting the environment.
#Unmount devices.
echo "disabling network access"
rm $1/etc/resolv.conf
mv $1/etc/resolv.conf.old $1/etc/resolv.conf
echo "Unmounting System Devices."
umount $1/dev/pts
umount $1/sys
umount $1/dev
umount $1/proc
echo "Done."

echo "Unmounting Home drive."
umount $1/home
echo "Done."

#echo "Unmounting Guest Operating System."
#umount /mnt/chroot
echo "Returned to Host System Successfully!"
}
##
Das wären so die sinnvollsten, die eigentlich jeder verwenden kann. Kürzel und scripte, die auf bestimmte Rechner in meinem Netz abzielen, habe ich bewußt weggelassen, wie auch z.B. unter "duplicate_dir" der Zielrechner und Port durch eine Variable ersetzt wurden. Dieses Kürzel erschien mir jedoch zu nützlich, um es wegzulassen, da man recht einfach dieses auch für entfernte, verschlüsselte Verbindungen umschreiben kann (z.B. mit ssh), sowie beide Kürzel (send und recv) dann auch zusammenfassen kann.
Weitere Scripte sind dann etwas länger und umfassen z.B. Backups auf Tape,
Ergänzung ()

Ach, eines noch:

Da bei mir jedes 'apt-get install' mit einem 'apt-get update && apt-get install' ersetzt wird, begrenze ich das update auf Intervalle von 6h mit

Code:
update(){    ## apt-get update, if not done so for $THRESHOLD=( 6h )
    NOW=`date +%s`
    # Letztes Update in sekunden ( 6h )
    THRESHOLD=10800
    let LASTUPDATE=$(cat /lastupdate.txt)+$THRESHOLD
    # wenn das letzte Update vor ${THRESHOLD} war, dann führe 'apt-get update' erneut aus
    if [ $LASTUPDATE -le $NOW ]; then
        sudo apt-get update
        if [ $? -ne 0 ]; then
            echo "Fehler."
            return 1
            break
        fi
        echo $(date +%s) > /lastupdate.txt
        if [ $? -ne 0 ]; then
            echo "konnte die Datei lastupdate.txt nicht anlegen."
            echo "Taste..."
            read -n 1 -s
            break
        fi
    else
        let UPDATEDONE=$(date +%s)-$(cat /lastupdate.txt)
        if [ "$UPDATEDONE" -gt "60" ]; then
            let UPDATEDONE=${UPDATEDONE}/60
            EINHEIT="Minuten"
            if [ "$UPDATEDONE" -gt "60" ]; then
                UPDATEDONE=$(echo "scale=2 ; ${UPDATEDONE} / 60" | bc)
                UPDATE2DONE=$(echo "scale=2 ; .${UPDATEDONE#*.} * 60" | bc )
                EINHEIT="Minuten"
                UPDATEDONE=$(echo "${UPDATEDONE%.*} Stunden, ${UPDATE2DONE%.*}")
            fi
        else
        EINHEIT="Sekunden"
        fi
        echo ""
        echo "Update nicht nötig. Letztes Update vor ${UPDATEDONE} ${EINHEIT}."
        echo ""
        unset UPDATEDONE
        unset UPDATE2DONE
    fi
}
 
Zuletzt bearbeitet:
Zurück
Oben