~ubuntu-branches/ubuntu/trusty/dlocate/trusty

« back to all changes in this revision

Viewing changes to dlocate

  • Committer: Bazaar Package Importer
  • Author(s): Craig Sanders
  • Date: 2009-06-03 11:24:02 UTC
  • mfrom: (3.1.1 karmic)
  • Revision ID: james.westby@ubuntu.com-20090603112402-glc1211vgmee8yel
Tags: 1.02
* fixed example in dlocate.1 man page again (Closes: #466662)
* added '-k', and '-K' commands to list kernels and related packages
* added optional support for gzip compression of /var/lib/dlocate/dlocatedb.txt
* added support output filters (--package-only, --filename-only) (Closes: #531641)

Show diffs side-by-side

added added

removed removed

Lines of Context:
17
17
DPKGLIST=/var/lib/dlocate/dpkg-list
18
18
DPKG_INFO=/var/lib/dpkg/info
19
19
 
20
 
if [ -x /usr/bin/locate.findutils ] ; then
21
 
    # locate package is installed
22
 
    LOCATE='/usr/bin/locate.findutils'
23
 
else
24
 
    # slocate diverts locate
25
 
    LOCATE=$(/usr/sbin/dpkg-divert --truename /usr/bin/locate)
26
 
fi
 
20
COMPRESS_DLOCATEDB='0'
 
21
GREP='grep'
 
22
[ -e /etc/default/dlocate ] && . /etc/default/dlocate
 
23
[ "$COMPRESS_DLOCATE" = "1" ] && GREP='zgrep'
27
24
 
28
25
function dlocate_help {
29
26
  cat <<__EOF__
30
 
Usage: dlocate [option] [string...]
31
 
 
32
 
Options:
33
 
  (no option) string  list all records that match
34
 
  -S          string      list records where files match
35
 
  -L          package     list all files in package
36
 
  -l          package     almost-emulation of 'dpkg -l'
37
 
  -s          package     print package's status
38
 
  -ls         package     'ls -ldF' of all files in package
39
 
  -du         package     'du -sck' of all files in package
40
 
  -conf       package     list conffiles in package
41
 
  -lsconf     package     'ls -ldF' of conffiles in package
42
 
  -md5sum     package     list package's md5sums (if any)
43
 
  -md5check   package     check package's md5sums (if any)
44
 
  -man        package     list package's man pages (if any)
45
 
  -lsman      package     list full path/filenames of man pages
46
 
  -lsbin      package     list full path/filenames of executable files
47
 
 
48
 
  --                      stop processing options.  remainder of
49
 
                          command-line is filename(s)
50
 
 
51
 
  --ignore-case, -i       ignore case when search for filenames or
52
 
                          package names.
53
 
 
54
 
  -h                      display this help message and exit.
55
 
  -V                      display dlocate's version number and exit.
56
 
 
57
 
  The -L, -s, and -S commands are roughly analagous to the
58
 
  equivalent dpkg commands.
 
27
Usage: dlocate [option...] [command] [PATTERN...]
 
28
 
 
29
Commands:
 
30
  DEFAULT/none PATTERN   list records that match either package or files names
 
31
  -S           PATTERN   list records that match filenames
 
32
 
 
33
  -L           package   list all files in package
 
34
  -l           package   regexp-enhanced emulation of 'dpkg -l'
 
35
  -s           package   print package's status
 
36
  -ls          package   'ls -ldF' of all files in package
 
37
  -du          package   'du -sck' of all files in package
 
38
  -conf        package   list conffiles in package
 
39
  -lsconf      package   'ls -ldF' of conffiles in package
 
40
  -md5sum      package   list package's md5sums (if any)
 
41
  -md5check    package   check package's md5sums (if any)
 
42
  -man         package   list package's man pages (if any)
 
43
  -lsman       package   list full path/filenames of man pages
 
44
  -lsbin       package   list full path/filenames of executable files
 
45
  -K                     list installed kernel & related packages
 
46
  -k                     detailed list of installed kernel & related packages
 
47
 
 
48
  --                    stop processing commands and options.  remainder of
 
49
                        command-line is filename(s)
 
50
 
 
51
 
 
52
The -l, and -S commands are approximately the same as the equivalent dpkg
 
53
options except that the search is performed using regular expressions
 
54
rather than fixed strings.
 
55
 
 
56
Options
 
57
 
 
58
  --filename-only        only output file names when searching for files
 
59
  --package-only         only output package names when searching for files
 
60
 
 
61
Regular Expression Options (see grep(1) for details):
 
62
 
 
63
  -E, --extended-regexp
 
64
  -F, --fixed-strings
 
65
  -G, --basic-regexp
 
66
  -P, --perl-regexp
 
67
 
 
68
  -w, --word-regexp     restrict matches to whole words
 
69
  -i, --ignore-case     case-insensitive match
 
70
 
 
71
Miscellaneous Options:
 
72
 
 
73
  -h, -H, --help          display this help message and exit.
 
74
  -V, --version           display dlocate's version number and exit.
 
75
  -v, --verbose, --debug  verbose/debug output
59
76
__EOF__
60
77
  exit 1
61
78
}
62
79
 
63
80
function dlocate_version {
64
 
  #VERSION_BANNER=$(grep-dctrl -X -P dlocate -n -s Version -d \
65
 
  #  /var/lib/dpkg/status | sed -e '2s/.*/(&)/')
66
 
  VERSION_BANNER="0.96.1"
67
 
  echo "dlocate version "$VERSION_BANNER
68
 
  exit
 
81
  VERSION_BANNER="1.02"
 
82
  echo "dlocate version $VERSION_BANNER"
 
83
  exit 0
69
84
}
70
85
 
71
86
function dlocate_option_error () {
75
90
  exit 1
76
91
}
77
92
 
 
93
OPTION="DEFAULT"
 
94
 
 
95
LAST_OPT=0
 
96
 
 
97
# default to extended regexp
 
98
RE_TYPE="-E"
 
99
DCTRL_RE_TYPE="-e"
 
100
RE_SEPARATOR="|"
 
101
 
 
102
# default to case-sensitive
78
103
IGNORE_CASE=""
79
 
LAST_OPT=0
80
 
 
81
 
OPTION="DEFAULT"
 
104
# default to non- word-based searches
 
105
WORD_RE=""
 
106
 
 
107
# output filters for -S and DEFAULT option
 
108
OUTPUT_FILTER="none"
 
109
 
 
110
function output_filter() {
 
111
  [ "$VERBOSE" = "1" ] && echo "OUTPUT FILTER: $OUTPUT_FILTER"
 
112
 
 
113
  case "$OUTPUT_FILTER" in
 
114
 
 
115
      ("Filenames only")    
 
116
            cut -d\  -f 2 | sort -u
 
117
            ;;
 
118
 
 
119
      ("Packages only")
 
120
            cut -d:  -f 1 | sort -u
 
121
            ;;
 
122
 
 
123
      (*)
 
124
            cat
 
125
            ;;
 
126
  esac
 
127
}
 
128
 
 
129
VERBOSE=0
82
130
 
83
131
SEPARATOR='::::::::'
84
132
PKGS=""
85
133
for p in "$@"; do
86
 
      case "$p" in
 
134
    if [ "$LAST_OPT" -eq 1 ] ; then
 
135
        PKGS="$PKGS$SEPARATOR$p"
 
136
    else case "$p" in
87
137
 
88
138
        ('--')
89
 
 
90
 
            if [ $LAST_OPT -eq 0 ] ; then
91
139
                LAST_OPT=1
92
 
            else
93
 
                PKGS="$PKGS$SEPARATOR$p"
94
 
            fi
95
140
            ;;
96
141
 
97
142
        (''|'-h'|'-H'|'--help')
98
 
 
99
 
            if [ $LAST_OPT -eq 0 ] ; then
100
143
                dlocate_help
101
 
            else
102
 
                PKGS="$PKGS$SEPARATOR$p"
103
 
            fi
104
144
            ;;
105
145
 
106
 
        ('-v'|'-V'|'--version')
107
 
 
108
 
            if [ $LAST_OPT -eq 0 ] ; then
 
146
        ('-V'|'--version')
109
147
                dlocate_version
110
 
            else
111
 
                PKGS="$PKGS$SEPARATOR$p"
112
 
            fi
113
 
            ;;
114
 
 
115
 
        ('--ignore-case'|'-i')
116
 
 
117
 
            if [ $LAST_OPT -eq 0 ] ; then
 
148
            ;;
 
149
 
 
150
        ('-v'|'--verbose'|'--debug')
 
151
                VERBOSE=1
 
152
            ;;
 
153
 
 
154
        ('-K'|'-k')
 
155
                OPTION="$p"
 
156
                PKGS="dummy"
 
157
            ;;
 
158
 
 
159
        ('-S'|'-L'|'-l'|'-s'|'-ls'|'-du'|'-conf'|'-lsconf'|'-md5sum'|'-md5check'|'-man'|'-lsman'|'-lsbin')
 
160
                OPTION="$p"
 
161
            ;;
 
162
 
 
163
        ('-i'|'--ignore-case')
118
164
                IGNORE_CASE='-i'
119
 
            else
120
 
                PKGS="$PKGS$SEPARATOR$p"
121
 
            fi
122
 
            ;;
123
 
 
124
 
        ('-S'|'-L'|'-l'|'-s'|'-ls'|'-du'|'-conf'|'-lsconf'|'-md5sum'|'-md5check'|'-man'|'-lsman'|'-lsbin')
125
 
 
126
 
            if [ $LAST_OPT -eq 0 ] ; then
127
 
                OPTION="$1"
128
 
            else
129
 
                PKGS="$PKGS$SEPARATOR$p"
130
 
            fi
 
165
            ;;
 
166
 
 
167
        ('-E'|'--extended-regexp')
 
168
                RE_TYPE='-E'
 
169
                DCTRL_RE_TYPE='-e'
 
170
                RE_SEPARATOR='|'
 
171
            ;;
 
172
 
 
173
        ('-F'|'--fixed-strings')
 
174
                RE_TYPE='-F'
 
175
                RE_SEPARATOR="\n"
 
176
            ;;
 
177
            
 
178
        ('-G'|'--basic-regexp')
 
179
                RE_TYPE='-G'
 
180
                DCTRL_RE_TYPE='-r'
 
181
                RE_SEPARATOR='\\|'
 
182
            ;;
 
183
 
 
184
        ('-P'|'--perl-regexp')
 
185
                RE_TYPE='-P'
 
186
                RE_SEPARATOR='|'
 
187
            ;;
 
188
 
 
189
        ('-w'|'--word-regexp')
 
190
                WORD_RE="-w"
 
191
            ;;
 
192
 
 
193
        ('--filename-only')
 
194
                OUTPUT_FILTER='Filenames only'
 
195
            ;;
 
196
 
 
197
        ('--package-only')
 
198
                OUTPUT_FILTER='Packages only'
131
199
            ;;
132
200
 
133
201
        (-*)
134
 
            if [ $LAST_OPT -eq 0 ] ; then
135
202
                dlocate_option_error $1
136
 
            else
137
 
                PKGS="$PKGS$SEPARATOR$p"
138
 
            fi
139
203
            ;;
140
204
 
141
205
        (*)
142
 
            PKGS="$PKGS$SEPARATOR$p"
 
206
                PKGS="$PKGS$SEPARATOR$p"
143
207
            ;;
144
208
      esac
 
209
    fi
145
210
done
146
211
 
147
212
PKGS=$(echo "$PKGS" | sed -e "s/^$SEPARATOR//")
148
 
#echo $PKGS
149
 
 
150
 
PKGS_REGEXP=$(echo "$PKGS" | sed -e "s/$SEPARATOR/|/g")
151
 
#echo $PKGS_REGEXP
152
 
 
153
 
FILES_REGEXP="$PKGS_REGEXP"
154
 
#echo $FILES_REGEXP
155
 
 
156
 
#exit
 
213
[ -z "$PKGS" ] && dlocate_help
 
214
 
 
215
PKGS_REGEXP=$(echo "$PKGS" | sed -e "s/$SEPARATOR/$RE_SEPARATOR/g")
 
216
 
 
217
FILES_REGEXP="($PKGS_REGEXP)"
 
218
[ "$WORD_RE" = "-w" ] && FILES_REGEXP="\b$FILES_REGEXP\b"
 
219
 
 
220
PKGS=$(echo "$PKGS" | sed -e "s/$SEPARATOR/ /")
 
221
 
 
222
if [ "$VERBOSE" = "1" ] ; then
 
223
    echo "PKGS:" $PKGS
 
224
    echo "RE_SEPARATOR:" $RE_SEPARATOR
 
225
    echo "PKGS_REGEXP:" $PKGS_REGEXP
 
226
fi
157
227
 
158
228
[ -z "$PKGS_REGEXP" ] && PKGS_REGEXP='^$'
159
229
 
188
258
 
189
259
    BODY_FMT_STRING="%-2s  %-${fieldw}.${fieldw}s %-${fieldw}.${fieldw}s %-${fieldd}.${fieldd}s\\n"
190
260
 
191
 
    BODY=$( egrep $IGNORE_CASE -- "$PKGS_REGEXP" "$DPKGLIST" | \
 
261
    [ "$VERBOSE" = "1" ] && echo RUNNING: $GREP $RE_TYPE $WORD_RE $IGNORE_CASE -- "$PKGS_REGEXP" "$DPKGLIST" 
 
262
 
 
263
    BODY=$($GREP $RE_TYPE $WORD_RE $IGNORE_CASE -- "$PKGS_REGEXP" "$DPKGLIST" | \
192
264
            awk -F'\t' "{ printf \"$BODY_FMT_STRING\", \$1, \$2, \$3, \$4 }" |
193
265
            sed -e 's/ *$//g'
194
266
          )
197
269
 
198
270
elif [ "$OPTION" = '-S' ] ; then
199
271
 
200
 
    $LOCATE -d $DLOCATEDB $IGNORE_CASE -- $PKGS | egrep $IGNORE_CASE "^[-a-zA-Z0-9_.+]+:.*($FILES_REGEXP)"
 
272
    if [ "$RE_TYPE" = '-F' ] ; then
 
273
        echo "Error: -F Fixed String searches are incompatible with -S"
 
274
        echo
 
275
        exit 1
 
276
    fi
 
277
    PREFIX="^([-a-zA-Z0-9_.+]+:|diversion by )"
 
278
    [ "$RE_TYPE" = "-G" ] && PREFIX="^([-a-zA-Z0-9_.+]+:\|diversion by )"
 
279
 
 
280
    [ "$VERBOSE" = "1" ] && echo RUNNING: $GREP $RE_TYPE $IGNORE_CASE "$PREFIX.*$FILES_REGEXP" "$DLOCATEDB"
 
281
    $GREP $RE_TYPE $IGNORE_CASE "$PREFIX.*$FILES_REGEXP" "$DLOCATEDB" | output_filter
201
282
    result=$?
202
283
 
203
284
elif [ "$OPTION" = 'DEFAULT' ] ; then
204
285
 
205
 
    $LOCATE -d $DLOCATEDB $IGNORE_CASE -- $PKGS
 
286
    [ "$VERBOSE" = "1" ] && echo RUNNING: $GREP $RE_TYPE $IGNORE_CASE $WORD_RE "$PKGS_REGEXP" "$DLOCATEDB"
 
287
    $GREP $RE_TYPE $IGNORE_CASE $WORD_RE "$PKGS_REGEXP" "$DLOCATEDB" | output_filter
 
288
    result=$?
 
289
 
 
290
elif [ "$OPTION" = '-s' ] ; then
 
291
    DCTRL_REGEXP="^($PKGS_REGEXP)$"
 
292
 
 
293
    [ "$VERBOSE" = "1" ] && echo RUNNING: grep-dctrl -X -P $DCTRL_RE_TYPE $DCTRL_REGEXP /var/lib/dpkg/status 
 
294
    grep-dctrl -P $DCTRL_RE_TYPE $DCTRL_REGEXP /var/lib/dpkg/status 
 
295
    result=$?
 
296
 
 
297
elif [ "$OPTION" = '-k' ] ; then
 
298
 
 
299
    grep-status -P -e "(^linux-(image|source|headers|doc|debug)|nvidia-kernel-|.*-modules-)" | \
 
300
        grep-dctrl -n -s Package -F status " installed" - | \
 
301
        egrep -v -- '^(lib|openser|pam|scim|tryton|wims)|-perl'
 
302
 
 
303
    result=$?
 
304
 
 
305
elif [ "$OPTION" = '-K' ] ; then
 
306
    KERN_RE=$(dlocate -k | xargs | sed -e 's/ /|/g')
 
307
 
 
308
    [ "$VERBOSE" = "1" ] && echo echo RUNNING: dlocate -P -l "\s($KERN_RE)\s"
 
309
    dlocate -P -l "\s($KERN_RE)\s"
206
310
    result=$?
207
311
 
208
312
else
209
 
 
210
313
    for PKG in $PKGS; do
211
 
 
212
314
        case "$OPTION" in
213
315
 
214
316
            '-L')
219
321
                fi
220
322
                ;;
221
323
 
222
 
            '-s')
223
 
                    grep-dctrl -X -P $PKG /var/lib/dpkg/status || \
224
 
                    echo Package $PKG does not exist. >&2
225
 
                ;;
226
 
 
227
324
            '-ls')
228
325
                if [ -s $DPKG_INFO/$PKG.list ] ; then
229
326
                    xargs -r ls -ldF < $DPKG_INFO/$PKG.list
267
364
            '-lsman')
268
365
                if [ -s $DPKG_INFO/$PKG.list ] ; then
269
366
                    dlocate -L $PKG | \
270
 
                    grep '/man.*/.*[0-9]/'
 
367
                    grep -E '/man[0-9]+/'
271
368
                else
272
369
                    echo Package $PKG not installed or $PKG.list is empty. >&2
273
370
                fi
274
 
;;
 
371
                ;;
275
372
 
276
373
            '-man')
277
374
                if [ -s $DPKG_INFO/$PKG.list ] ; then
278
375
                    dlocate -L $PKG | \
279
 
                        sed -n -e 's/\.gz$//' \
280
 
                               -e '/\/man.*\/.*[0-9]/s/^.*\/\([^\/]*\)\.\(.*\)/\2 \1/p'
 
376
                        grep -E '/man[0-9]+/' | \
 
377
                        sed -e 's/\.gz$//' \
 
378
                            -e 's:.*/::' \
 
379
                            -e 's/\(^.*\)\.\(.*\)/\2 \1/' | \
 
380
                        sort -u
281
381
                else
282
382
                    echo Package $PKG not installed or $PKG.list is empty. >&2
283
383
                fi
288
388
                    dlocate -L $PKG | \
289
389
                    xargs -r ls -lLd 2> /dev/null | \
290
390
                    grep -v "^[^-]" | \
291
 
                    egrep '^-.{2,8}[xs]' | \
 
391
                    grep -E '^-.{2,8}[xs]' | \
292
392
                    sed -e 's/.* \//\//' | \
293
393
                    xargs -r ls -1
294
394
                else
295
395
                    echo Package $PKG not installed or $PKG.list is empty. >&2
296
396
                fi
297
 
;;
 
397
                ;;
298
398
 
299
399
            '-md5check')
300
400
                if [ -s $DPKG_INFO/$PKG.md5sums ] ; then