initial commmit
This commit is contained in:
commit
9e48b48173
1
COPYING.txt
Normal file
1
COPYING.txt
Normal file
@ -0,0 +1 @@
|
|||||||
|
Copyright © 2024 Tilman Kranz <mailto:t.kranz@tk-sls.de>
|
17
LICENSE.txt
Normal file
17
LICENSE.txt
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
|
this software and associated documentation files (the “Software”), to deal in
|
||||||
|
the Software without restriction, including without limitation the rights to
|
||||||
|
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||||
|
of the Software, and to permit persons to whom the Software is furnished to do
|
||||||
|
so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
44
README.md
Normal file
44
README.md
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
```
|
||||||
|
xdg-desktop-search [ OPTIONS ] SEARCH ...
|
||||||
|
```
|
||||||
|
|
||||||
|
## Arguments
|
||||||
|
|
||||||
|
- `SEARCH`: Search .desktop files with search directives containing this
|
||||||
|
string. The searched directives are "Name" and "Exec" by default but can be
|
||||||
|
overridden using the -s option (see below).
|
||||||
|
|
||||||
|
## Options
|
||||||
|
|
||||||
|
- `-h`, `--help`: Print this message and exit.
|
||||||
|
|
||||||
|
- `-v`, `--verbose`: Print directives in found .desktop files.
|
||||||
|
|
||||||
|
- `-d STRING`, `--show-directive STRING`: Instead of printing all directives
|
||||||
|
when searching in verbose mode, print only this directive (e.g. "Name").
|
||||||
|
Option can be repeated to print multiple directives.
|
||||||
|
|
||||||
|
- `-s STRING`, `--search-directive STRING`: Instead of searching directives
|
||||||
|
"Name" and "Exec" for strings containing SEARCH, search the given directive
|
||||||
|
instead (e.g. "Comment"). Option can be repeated to search in multiple directives.
|
||||||
|
|
||||||
|
|
||||||
|
## Return Values
|
||||||
|
|
||||||
|
The command returns 0 if .desktop files were found that match the specified
|
||||||
|
criteria, 1 on usage error and 2 if no matching .desktop files were found.
|
||||||
|
|
||||||
|
## Example
|
||||||
|
|
||||||
|
Search for the string "firefox" in all .desktop files found in the path
|
||||||
|
specified by `XDG_DATA_DIRS`. To match, the string "firefox" must be contained
|
||||||
|
in either the "Exec" or the "Comment" directive. List the matching files, also
|
||||||
|
show the "Exec" and "TryExec" directives in each found file.
|
||||||
|
|
||||||
|
```shell
|
||||||
|
xdg-desktop-search -s Exec -s Comment -v -d Exec -d TryExec firefox
|
||||||
|
```
|
153
xdg-desktop-search
Executable file
153
xdg-desktop-search
Executable file
@ -0,0 +1,153 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# Summary: Search for .desktop files with directives that match certain search strings.
|
||||||
|
# License: MIT <https://opensource.org/license/mit>
|
||||||
|
# Author: Tilman Kranz <t.kranz@tk-sls.de>
|
||||||
|
|
||||||
|
##
|
||||||
|
# Configuration
|
||||||
|
|
||||||
|
name=$(basename "$(readlink -f "$0")")
|
||||||
|
IFS=":"
|
||||||
|
xdg_data_dirs=${XDG_DATA_DIRS:-/usr/share/gnome:$HOME/.local/share/flatpak/exports/share:/var/lib/flatpak/exports/share:/usr/local/share:/usr/share}
|
||||||
|
search_regex=.*
|
||||||
|
help=false
|
||||||
|
verbose=false
|
||||||
|
show_directives_regex=.*
|
||||||
|
search_directives_regex="(Name|Exec)"
|
||||||
|
|
||||||
|
##
|
||||||
|
# Functions
|
||||||
|
|
||||||
|
usage() {
|
||||||
|
cat << EOF
|
||||||
|
Usage: $name [ OPTIONS ] SEARCH ...
|
||||||
|
|
||||||
|
Arguments:
|
||||||
|
|
||||||
|
SEARCH: Search .desktop files with search directives
|
||||||
|
containing this string. The searched directives
|
||||||
|
are "Name" and "Exec" by default but can be
|
||||||
|
overridden using the -s option (see below).
|
||||||
|
|
||||||
|
Options:
|
||||||
|
|
||||||
|
-h | --help Print this message and exit.
|
||||||
|
-v | --verbose Print directives in found .desktop files.
|
||||||
|
-d STRING | --show-directive STRING
|
||||||
|
Instead of printing all directives when
|
||||||
|
searching in verbose mode, print only
|
||||||
|
this directive (e.g. "Name"). Option can
|
||||||
|
be repeated to print multiple directives.
|
||||||
|
-s STRING | --search-directive STRING
|
||||||
|
Instead of searching directives "Name" and
|
||||||
|
"Exec" for strings containing SEARCH,
|
||||||
|
search the given diretcive instead
|
||||||
|
(e.g. "Comment"). Option can be repeated
|
||||||
|
to search in multiple directives.
|
||||||
|
|
||||||
|
Return Values:
|
||||||
|
|
||||||
|
The command returns 0 if .desktop files were found that
|
||||||
|
match the specified criteria, 1 on usage error and 2 if
|
||||||
|
no matching .desktop files were found.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
Search for the string "firefox" in all .desktop files found
|
||||||
|
in the path specified by XDG_DATA_DIRS. To match, the string
|
||||||
|
"firefox" must be contained in either the "Exec" or the
|
||||||
|
"Comment" directive. List the matching files, also show the
|
||||||
|
"Exec" and "TryExec" directives in each found file.
|
||||||
|
|
||||||
|
$name -s Exec -s Comment -v -d Exec -d TryExec firefox
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
join() {
|
||||||
|
local IFS="$1"
|
||||||
|
shift
|
||||||
|
echo "$*"
|
||||||
|
}
|
||||||
|
|
||||||
|
parse_options() {
|
||||||
|
local search=()
|
||||||
|
local search_directives=()
|
||||||
|
local show_directives=()
|
||||||
|
local argc=$#
|
||||||
|
local counter=1
|
||||||
|
|
||||||
|
while true ; do
|
||||||
|
[[ $counter -gt $argc ]] && break
|
||||||
|
argument=$1
|
||||||
|
shift
|
||||||
|
(( counter++ ))
|
||||||
|
|
||||||
|
case "$argument" in
|
||||||
|
-h|--help)
|
||||||
|
help=true
|
||||||
|
;;
|
||||||
|
-v|--verbose)
|
||||||
|
verbose=true
|
||||||
|
;;
|
||||||
|
-d|--show-directive)
|
||||||
|
[[ $counter -gt $argc ]] && {
|
||||||
|
echo "ERROR: Missing argument for option -d; aborted." >&2 ;
|
||||||
|
exit 1 ;
|
||||||
|
}
|
||||||
|
show_directives+=( "$1" )
|
||||||
|
shift
|
||||||
|
(( counter++ ))
|
||||||
|
;;
|
||||||
|
-s|--search-directive)
|
||||||
|
[[ $counter -gt $argc ]] && {
|
||||||
|
echo "ERROR: Missing argument for option -s; aborted." >&2 ;
|
||||||
|
exit 1 ;
|
||||||
|
}
|
||||||
|
search_directives+=( "$1" )
|
||||||
|
shift
|
||||||
|
(( counter++ ))
|
||||||
|
;;
|
||||||
|
|
||||||
|
*)
|
||||||
|
search+=( "$argument" )
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
[[ "${#search_directives[@]}" -gt 0 ]] && search_directives_regex="($(join "|" ${search_directives[@]}))"
|
||||||
|
[[ "${#show_directives[@]}" -gt 0 ]] && show_directives_regex="^($(join "|" ${show_directives[@]}))="
|
||||||
|
[[ "${#search[@]}" -gt 0 ]] && search_regex="^$search_directives_regex=.*($(join "|" ${search[@]}))"
|
||||||
|
}
|
||||||
|
|
||||||
|
##
|
||||||
|
# Main Program
|
||||||
|
|
||||||
|
parse_options $@
|
||||||
|
|
||||||
|
"$help" && { usage ; exit 0 ; }
|
||||||
|
|
||||||
|
found=0
|
||||||
|
|
||||||
|
for data_dir in $xdg_data_dirs ; do
|
||||||
|
applications="$data_dir/applications"
|
||||||
|
|
||||||
|
[[ -d $applications ]] && for desktop in "$applications"/*.desktop ; do
|
||||||
|
grep -Eiq "$search_regex" "$desktop" && {
|
||||||
|
(( found++ ))
|
||||||
|
if "$verbose" ; then
|
||||||
|
echo "# $desktop"
|
||||||
|
grep -Ei "$show_directives_regex" "$desktop"
|
||||||
|
else
|
||||||
|
echo "$desktop"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
done
|
||||||
|
done
|
||||||
|
|
||||||
|
if [[ $found -gt 0 ]] ; then
|
||||||
|
exit 0
|
||||||
|
else
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
|
|
||||||
|
# vim: tabstop=2 shiftwidth=2 softtabstop=2 expandtab:
|
Loading…
Reference in New Issue
Block a user