initial commmit

This commit is contained in:
Tilman Kranz 2024-11-03 16:49:29 +01:00
commit 9e48b48173
4 changed files with 215 additions and 0 deletions

1
COPYING.txt Normal file
View File

@ -0,0 +1 @@
Copyright © 2024 Tilman Kranz <mailto:t.kranz@tk-sls.de>

17
LICENSE.txt Normal file
View 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
View 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
View 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: