¿Cómo puedo enumerar todas las aplicaciones instaladas en mi sistema?

18

Lo sé, solo puedo presionar Super+ Apara ver todas las aplicaciones instaladas en Ubuntu, pero necesito un comando para enumerar sus nombres. El comando

dpkg --get-selections | awk '{print $1}'

Tampoco es una opción porque muestra todos los paquetes instalados y contiene controladores, núcleos y bibliotecas.

Danatela
fuente

Respuestas:

17

Se me ocurrió esta respuesta para las personas que quieren usar bash de una buena manera. Está claro que la respuesta de la pregunta está relacionada con la lista de los archivos /usr/share/applications, pero el problema es que el lscomando no debe analizarse nunca . En el pasado, estaba cometiendo el mismo error, pero ahora aprendí que la mejor manera es usar un forbucle para iterar sobre los archivos, incluso si debo usar algunas teclas más de mi precioso teclado:

for app in /usr/share/applications/*.desktop; do echo "${app:24:-8}"; done

También utilicé en las operaciones de manipulación de cadenas de comando anteriores : eliminado de los appprimeros 24 caracteres que son /usr/share/applications/y los últimos 8 caracteres que son .desktop.


Actualizar:

Otro lugar donde puede encontrar aplicaciones que se muestran en el tablero es ~/.local/share/applications/*.desktop. Por lo tanto, también debe ejecutar el siguiente comando:

for app in ~/.local/share/applications/*.desktop; do echo "${app:37:-8}"; done

Para unificar los dos comandos anteriores, puede usar:

for app in /usr/share/applications/*.desktop ~/.local/share/applications/*.desktop; do app="${app##/*/}"; echo "${app::-8}"; done
Radu Rădeanu
fuente
4

Para obtener la lista de todas sus aplicaciones instaladas con sus nombres, la forma más fácil es hacer:

sudo apt-get install aptitude
aptitude -F' * %p -> %d ' --no-gui --disable-columns search '?and(~i,!?section(libs), !?section(kernel), !?section(devel))'

Obtendrá una buena lista de todos los paquetes instalados que no son bibliotecas, ni núcleos, ni paquetes de desarrollo como este:

* zip -> Archiver for .zip files 
* zlib1g -> compression library - runtime 
* zlib1g-dev -> compression library - development 
* zsh -> shell with lots of features 
* zsh-common -> architecture independent files for Zsh 

Es más completo ya que también enumera las aplicaciones que no son GUI que no aparecerán en los .desktoparchivos

Braiam
fuente
No puedo estar de acuerdo con esta respuesta a esta pregunta. La respuesta es buena, pero no en este lugar. Está suficientemente claro que el OP quiere una lista con las aplicaciones que se pueden encontrar en el Tablero. Y no hay lugar para zsh, zsh-commony otros!
Radu Rădeanu
@ RaduRădeanu Acabo de usar la cola para mostrar un extracto de mis paquetes instalados, que termina con z, si hubiera usado head, comenzarán con a, 2) ¿quiere aplicaciones listadas en el "guión"? ¿Estás seguro?
Braiam
Braiam, entró, no se trata de qué comenzar con z o con un ... Cuando presionas Super + A en tu teclado, ¿qué puedes ver aparecer en tu pantalla desde la esquina superior izquierda?
Radu Rădeanu
1
@ El título de RaduRădeanu OP dice que quiere enumerar todas las aplicaciones instaladas en su sistema, excluyendo bibliotecas, controladores, núcleos y otros. Menciona una de las formas (que usa) para obtener la lista de aplicaciones, que está usando Super + A y eso solo muestra un subconjunto de las aplicaciones instaladas en el sistema; pero esto cubre la mayoría, si no todos, la respuesta estaría completa incluso con --no-guieliminado.
precisa
1
.. Retiro la --no-guiparte, parece que no está ahí para lo que pensé que era.
precisa
3

Ejecute el siguiente comando para ver todas las aplicaciones instaladas,

ls /usr/share/applications | awk -F '.desktop' ' { print $1}' -

Si desea obtener la lista de todas las aplicaciones instaladas, ejecute el siguiente comando,

ls /usr/share/applications | awk -F '.desktop' ' { print $1}' - > ~/Desktop/applications.txt

Almacenará el resultado del comando anterior en un applications.txtarchivo dentro de su ~/Desktopdirectorio.

O

También ejecute el siguiente comando en la terminal para enumerar las aplicaciones instaladas,

find /usr/share/applications -maxdepth 1 -type f -exec basename {} .desktop \; | sort

Para obtener la lista en el archivo de texto, ejecute el siguiente comando

find /usr/share/applications -maxdepth 1 -type f -exec basename {} .desktop \; | sort > ~/Desktop/applications.txt

Las entradas de escritorio para todas las aplicaciones instaladas se almacenan dentro del /usr/share/applicationsdirectorio, donde los nombres de los archivos están en el formato. application-name.desktopRetirar la .desktopparte de los nombres de los archivos le dará la lista total de aplicaciones instaladas.

Actualizar:

Como sugirió @Radu , también puede encontrar entradas de escritorio para sus aplicaciones instaladas adicionales dentro del ~/.local/share/applicationsdirectorio.

find /usr/share/applications ~/.local/share/applications -maxdepth 1 -type f -exec basename {} .desktop \;
Avinash Raj
fuente
Gracias Radu, sin embargo, ¿cuántas veces has visto un nombre de archivo que contiene una nueva línea? ¿Nunca? Pensado así . Entonces, ¿nunca debería usar algo muy útil debido a un caso límite que prácticamente nunca sucede? Creo que seguiré analizando ls, con fines de representación y para tareas no críticas como la anterior, y trataré de tener en cuenta esta limitación, ¡gracias por el aviso!
Rolf
0

Si necesita una lista de aplicaciones que se muestra cuando presiona Super+ A, puede usar ls /usr/share/applications. Lo único que debe hacer es reemplazar el .desktopfinal, que es una tarea bastante simple. Lo hago con sed:

ls /usr/share/applications | sed s/.desktop// - > installed-apps.txt

Pero puede hacerlo después de recibir la lista utilizando el editor de texto.

Danatela
fuente
2
@Radu, en realidad, los /usr/share/application/*.desktoparchivos no contienen ningún carácter especial, por lo que lsse permite analizar particularmente en este caso.
Danatela
Esto no enumera todas las aplicaciones que se muestran cuando presionas Super + A.
Radu Rădeanu
44
@ Semi-bit estás asumiendo que nada ha salido mal. ¿Qué pasa si soy un idiota y he creado un archivo llamado bad name.desktoppor ejemplo? No hay razón para arriesgar lsaquí.
terdon
0

No estoy seguro de por qué la mayoría de las respuestas publicadas implican extraer el nombre de archivo de los accesos directos de .desktop. Su nombre de archivo de acceso directo .desktop puede ser cualquier cosa, pero lo que importa es el Namecampo dentro del archivo de acceso directo. Si desea crear la lista de nombres de aplicaciones instaladas que se muestran en Dash, simplemente "grep" ese campo en[Desktop Entry]

Código rudimentario, con bash

#!/bin/bash

for file in /usr/share/applications/*.desktop;
do
    while IFS== read -r key val
    do
        if [[ -z $key ]]; then
            continue
        else
            if [[ $key =~ ^\[Desktop\ Entry ]]; then
                interesting_field=1
            elif [[ $key =~ ^\[ ]]; then
                interesting_field=0
            fi
        fi
        [[ $interesting_field -eq 1 ]] && [[ $key == "Name" ]] && echo $val
    done < $file
done

Pero esto no tiene en cuenta los accesos directos que están ocultos para que no se muestren en Dash. Alguien con una mejor comprensión de la especificación .desktop podría querer expandir aún más este código para excluir esos atajos

Editar: otro intento, con Python

#!/usr/bin/python

from os import listdir
from os.path import isfile, join
import ConfigParser

SHORTCUTDIR = "/usr/share/applications/"

shortcuts = [ file for file in listdir(SHORTCUTDIR) if isfile(join(SHORTCUTDIR, file)) and file.endswith(".desktop") ]
dash_shortcuts = []

for f in shortcuts:
    c = ConfigParser.SafeConfigParser()
    c.read(SHORTCUTDIR + f)

    try:
        if c.getboolean('Desktop Entry', 'NoDisplay') is True:
            continue
    except ConfigParser.NoOptionError:
        pass

    try:
        if "unity" in c.get('Desktop Entry', 'NotShowIn').lower():
            continue
    except ConfigParser.NoOptionError:
        pass

    try:
        if "unity" not in c.get('Desktop Entry', 'OnlyShowIn').lower():
            continue
    except ConfigParser.NoOptionError:
        pass

    dash_shortcuts += [ c.get("Desktop Entry", "Name") ]

for s in sorted(dash_shortcuts, key=str.lower):
    print s
Pedernal
fuente
3
Realmente debería expandir su respuesta para que sea más una respuesta.
Seth
@Seth publiqué demasiado pronto, lo siento. Me estaba rascando la cabeza descubriendo cómo analizar ini con bash
Flint
@AvinashRaj Ojalá sea así de simple, pero esa no es la forma correcta de analizar ini. El código explotará y emitirá ruidos si hay más de una Nameentrada en .desktop que está analizando, que siempre es el caso. Además, no debe suponer que todas las líneas que le interesen estarán en el número de línea fija
Flint
@AvinashRaj Sigue siendo malo: P No tuvo en cuenta que esa Nameopción podría estar fuera de ese rango de número de línea, especialmente con muchas opciones o líneas en blanco debajo [Desktop\ Entry ]. Y el archivo .desktop es un archivo ini
Flint
0

El interlocutor quiere enumerar los nombres de todas las "aplicaciones" instaladas.

En cuanto a las aplicaciones con archivos .desktop :

  • la respuesta de Danatela trata con aplicaciones que tienen archivos .desktop en/usr/share/applications
  • Como señaló Radu , las aplicaciones con archivos .desktop también se pueden encontrar en~/.local/share/applications
  • en este punto, cabe señalar que las aplicaciones con archivos .desktop pueden tener dos nombres
    • un "nombre" está disponible al consultar el Tablero en Unity o desde los menús en Xubuntu (por ejemplo). Este nombre se deriva de la Name=línea en el archivo .desktop respectivo. Un ejemplo es el "Mapa de caracteres".
    • el otro "nombre" es el que se utilizará al ejecutar la aplicación desde el terminal y es la primera palabra después Exec=. En el caso del "Mapa de caracteres", eso sería gucharmap.
  • los dos nombres (y el archivo .desktop) podrían relacionarse usando:
    • sed -ns '1F;/^\[Desktop Entry\]/,/^\[/{/^Name=/p;/^Exec=/h};${z;x;G;p}' /usr/share/applications/*.desktop
    • y
    • sed -ns '1F;/^\[Desktop Entry\]/,/^\[/{/^Name=/p;/^Exec=/h};${z;x;G;p}' $HOME/.local/share/applications/*.desktop

Con respecto a las aplicaciones sin archivos .desktop :

Dependiendo de cómo se defina "aplicación", algunos no tienen archivos .desktop.

  • ¿Podría algo así como conky, poppler-utils, qpdf, xdotooly wmctrlser considerados "aplicaciones"? ¿Cómo se deben identificar y enumerar por sus nombres (suponiendo que uno los haya instalado)?
  • ¿Qué pasa con awk, find, grep, lsy sedpara nombrar un poco más? ¿Son aplicaciones o no?

Si algo que tiene un comando se considera una aplicación, entonces el comando de Linux para enumerar todos los comandos y alias disponibles y esta respuesta ayudará a identificarlos.

DK Bose
fuente