Kommandozeilenprogramm „locate“ und Quoting (Anführungszeichen/Ticks)

Hallo Leute,

ich probiere gerade ein paar Kommandos und Programme auf der Kommandozeile (mit Bash auf openSUSE 12.1 64bit mit GNOME) durch.
Beim Programm locate ist mir aufgefallen, dass es bei meinem System nicht nur nicht standardmäßig installiert war, sondern offenbar auch nach Installation nicht wie erwartet funktioniert.

Wenn ich das Sternchen in dem zu suchenden Ausdruck als Platzhalter für beliebige Zeichen(folgen) verwende, bekomme ich eine Ausgabe, wenn ich das Ganze mit den englischen Anführungszeichen (“…”) oder mit Ticks (‘…’) schütze,
(vgl. Linux-Kompendium: Shellprogrammierung – Wikibooks, Sammlung freier Lehr-, Sach- und Fachbücher )
dann bekomme ich keine Ausgabe:

:~> locate "hp*"
:~> locate hp*
/home/savesurfer/hp-check.log
:~> locate 'hp*'
:~> 
:~> locate -p 'hp*'
:~> locate -p "hp*"
:~>

Kann mir jemand erklären, warum das so ist?

Die mitgelieferte Manpage verstehe ich so, dass man Anführungszeichen oder Ticks benutzen sollten:

DESCRIPTION
This manual page documents the GNU version of
locate. For each given pattern, locate searches
one or more databases of file names and displays
the file names that contain the pattern. Patterns
can contain shell-style metacharacters: *', ?‘,
and ]'. The metacharacters do not treat /’ or
.' specially. Therefore, a pattern foo*bar’
can match a file name that contains foo3/bar', and a pattern duck’ can match a file name that
contains `lake/.ducky’. Patterns that contain
metacharacters should be quoted to protect them
from expansion by the shell.

Kann es sein, dass die mitgelieferte Manpage nicht (mehr?) zu dem Programm passt? Die Manpage auf linux.die.net scheint eine andere zu sein:
locate(1): find files by name - Linux man page

Grüße Martin
(puzzeled pistazienfresser)

Deine Datenbank ist up to date? Lass mal “sudo updatedb” durchlaufen und
wiederhol den Test danach nochmal. (Bin jetzt leider grade auf 11.4 und
kann nicht selber testen ob da wirklich ein Unterschied auf 12.1 ist).
findutils-locate wird schon lange nicht mehr als Default installiert.


PC: oS 11.4 (dual boot 12.1) 64 bit | Intel Core i7-2600@3.40GHz | KDE
4.6.0 | GeForce GT 420 | 16GB Ram
Eee PC 1201n: oS 11.4 64 bit | Intel Atom 330@1.60GHz | KDE 4.7.4 |
nVidia ION | 3GB Ram

Die Datenbank war offenbar nicht schuld (habe vorsichtshalber das Aktualisieren auch noch mal mit sudo durchgeführt, nachdem ich es auch schon nach su - getan hatte).

Ich glaube ich habe die Lösung des Problems gefunden, als ich mir die oben zitierte Manpage nochmals durchlas. Offenbar soll das pattern also das Suchwort ohne Anführungsstriche eingegeben werden, wenn ***** auch als Platzhalter für beliebige und beliebig viele Buchstaben interpretiert werden soll - und nicht als Zeichen/Buchstabe (Sternchen).

Scheint in openSUSE 11.4 32bit übrigens auch genauso zu funktionieren.

Beim Kommando find ist es offenbar entsprechend, es sei denn, man gibt das Suchwort erst als Ergänzung zur Option -name oder -iname an:


:~> find "hp*"
find: `hp*': No such file or directory

:~> find hp*
hp-check.log

~> find -name "hp*"
./.hplip/hplip.conf
./.hplip/hp-systray.lock
./hp-check.log

:~> find -iname "hp*"
./.hplip/hplip.conf
./.hplip/hp-systray.lock
./hp-check.log
./Downloads/HP_635_Notebook_PC_Datasheet.pdf

:~> 

(Wobei die Optionen -name und -iname offenbar dann auch noch das das rekursive Suchen aktivieren also auch noch auch die Unterverzeichnisse mit durchsuchen lassen.)

In dem Heft “Linux Shell Handbook” von Linux Magazin/Linux-Magazine.com steht das bei in dem Artikel ab Seite 12 auf S. 13 aber wohl anders (Suche mit Platzhaltern und Anführungsstrichen) - vielleicht wird das in anderen Linux Distributionen anders interpretiert - oder einfach ein Fehler des Autors?

Grüße Martin

Am 19.01.2012 14:56, schrieb pistazienfresser:
>
> die datenbank war offenbar nicht schuld (habe vorsichtshalber das
> aktualisieren auch noch mal mit -sudo- durchgeführt, nachdem ich es
> auch schon nach -su – getan hatte).
>
Icch verwende sudo aus keinem besonderen Grund, ich bin’s halt gewohnt
(schon lange Zeit bevor ich vor ein paar Jahren von so einer komischen
neuen Distribution gehört habe die nur das verwendet und keinen root
mehr kennt).

> snip

> scheint in opensuse 11.4 32bit übrigens auch genauso zu
> funktionieren.
>
Bei mir eben nicht ich verwende unter 11.4 immer die einfachen
Anführungszeichen und hab das eben jetzt nochmal probiert und es geht
wie gewohnt.

Muss ich später mal unter 12.1 probieren, möchte eigentlich schon
verstehen können wozu man sowas ändert??


PC: oS 11.4 (dual boot 12.1) 64 bit | Intel Core i7-2600@3.40GHz | KDE
4.6.0 | GeForce GT 420 | 16GB Ram
Eee PC 1201n: oS 11.4 64 bit | Intel Atom 330@1.60GHz | KDE 4.7.4 |
nVidia ION | 3GB Ram

Hallo Martin,

Habe die Version vom GNU-Projekt:

~> locate --version
locate (GNU findutils) 4.4.2
Copyright (C) 2007 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html&gt;
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Eric B. Decker, James Youngman, and Kevin Dalley.
Built using GNU gnulib version e5573b1bad88bfabcda181b9e0125fb0c52b7d3b
~> cat /etc/SuSE-release
openSUSE 12.1 (x86_64)
VERSION = 12.1
CODENAME = Asparagus

Hast Du vielleicht eine Readhead-Version von locate (mlocate)?

Gruß
Martin

Das sieht mir ziemlich gleich aus hier (nur auf 11.4, ich kann heut
abend mal auf eine 12.1 schauen).


locate --version
locate (GNU findutils) 4.4.2
Copyright (C) 2007 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later
<http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Eric B. Decker, James Youngman, and Kevin Dalley.
Built using GNU gnulib version e5573b1bad88bfabcda181b9e0125fb0c52b7d3b

cat /etc/SuSE-release
openSUSE 11.4 (x86_64)
VERSION = 11.4
CODENAME = Celadon

Jetzt seh ich grad was, kannst du mal ‘hp’ statt ‘hp*’ verwenden? Das
glob Pattern bezieht sich hier bei mir auf den vollen Pfadnamen, sorry
hab ich vorher nicht gesehen.


PC: oS 11.4 (dual boot 12.1) 64 bit | Intel Core i7-2600@3.40GHz | KDE
4.6.0 | GeForce GT 420 | 16GB Ram
Eee PC 1201n: oS 11.4 64 bit | Intel Atom 330@1.60GHz | KDE 4.7.4 |
nVidia ION | 3GB Ram

(Leerzeilen eingefügt)


savesurfer@linux-99bi:~/Documents> locate *scan0069.pd*
/home/savesurfer/Documents/scan0069.pdf

savesurfer@linux-99bi:~/Documents> cd ~

savesurfer@linux-99bi:~> locate *scan0069.pd*
/home/savesurfer/Documents/scan0069.pdf

savesurfer@linux-99bi:~> locate "*scan0069.pd*"
/home/savesurfer/Documents/scan0069.pdf

savesurfer@linux-99bi:~> locate hp*
/home/savesurfer/hp-check.log

savesurfer@linux-99bi:~> locate sc*

savesurfer@linux-99bi:~> locate "sc*"

savesurfer@linux-99bi:~> locate "hp*"

savesurfer@linux-99bi:~> locate *hp*
/home/savesurfer/hp-check.log

savesurfer@linux-99bi:~> locate "*hp *" 
...*endlos viele Treffer, insbesondere von meiner Windowspartition*]
/windows/C/Windows/winsxs/x86_microsoft-windows-shpafact_31bf3856ad364e35_6.1.7600.16385_none_d14c5b98579c5bad/shpafact.dll

~> locate '*hp*'
...*endlos viele Treffer, insbesondere von meiner Windowspartition*]
/windows/C/Windows/winsxs/x86_microsoft-windows-shpafact_31bf3856ad364e35_6.1.7600.16385_none_d14c5b98579c5bad/shpafact.dll

~> locate 'hp-check.l*'

~> locate '*check.log'
/home/savesurfer/hp-check.log

:~> 

Häh?

Warum macht das einen Unterschied, ob das Sternchen nun nur hinten ist oder (auch) vorne?
Und wann wird nun rekursiv und mit Nachverfolgung von Links gesucht und wann nicht - das richtet sich auch nach dem Quoting?
Ich sehe nun gar keine von mir nachvollziehbare Systematik mehr.

Gruß
Martin Seidler=positively puzzled pistazienfresser

Am 19.01.2012 17:36, schrieb pistazienfresser:
> Warum macht das einen Unterschied, ob das Sternchen nun nur hinten ist
> oder (auch) vorne?

Wegen der Shell-Expansion des Musters, du kannst ja ganz einfach mit
echo überprüfen was mit deinen Ausdrücken passiert.

Ruf mal echo hp* in dem Verzeichnis auf in dem die Datei ist und dann
ruf’s mal ausserhalb auf, das ist letztlich genau das gleiche was als
Parameter an locate übergeben wird.

> Und wann wird nun rekursiv und mit Nachverfolgung von Links gesucht und
> wann nicht - das richtet sich auch nach dem Quoting?
Nein, es ist nur gegen Expansion geschützt, wenn in Anführungszeichen.


PC: oS 11.4 (dual boot 12.1) 64 bit | Intel Core i7-2600@3.40GHz | KDE
4.6.0 | GeForce GT 420 | 16GB Ram
Eee PC 1201n: oS 11.4 64 bit | Intel Atom 330@1.60GHz | KDE 4.7.4 |
nVidia ION | 3GB Ram