Wie erhalte ich eine Liste nur der Dateien (nicht der Verzeichnisse) aus einem Paket?

7

Mit kann dpkg -L <package name>ich eine Liste aller Dateien aus einem Paket abrufen, aber es enthält auch eine Liste der Verzeichnisse, die ich ausschließen möchte.

Also zum Beispiel:

dpkg -L elixir

gibt mir:

/.
/usr
/usr/bin
/usr/lib
/usr/lib/elixir
/usr/lib/elixir/bin
/usr/lib/elixir/bin/elixir
/usr/lib/elixir/bin/elixirc
/usr/lib/elixir/bin/iex
/usr/lib/elixir/bin/mix
/usr/lib/elixir/lib
/usr/lib/elixir/lib/eex
/usr/lib/elixir/lib/eex/ebin
/usr/lib/elixir/lib/eex/ebin/Elixir.EEx.Compiler.beam
(etc...)

Ich habe versucht, die Verzeichnisse mit folgendem auszuschließen:

dpkg -L elixir |  find  -maxdepth 1 -not -type d

Aber das gibt nur die Datei im aktuellen Verzeichnis.

Das Weiterleiten der dpkgAusgabe an lsmit xargsscheint mir auch nicht zu erlauben, Verzeichnisse herauszufiltern.

Mydoghaswürmer
quelle

Antworten:

11

Durchlaufen Sie einfach jede Zeile von dpkg -L elixirund testen Sie, ob die Zeile der Pfad einer regulären Datei ist. Dann gilt echoFolgendes:

while read f; do [ -f "$f" ] && echo "$f"; done < <(dpkg -L elixir)

Deine Idee mit findsieht aber gut ausfind

  1. akzeptiert nicht stdin und
  2. sucht im angegebenen Pfad, während Sie nur die Eigenschaften des einzelnen angegebenen Pfads überprüfen möchten.

Daher ist es hier nicht das richtige Werkzeug.

Melebius
quelle
11

Dies sollte xargszum Beispiel mit einem Shell-Test möglich sein

dpkg -L elixir | xargs sh -c 'for f; do [ -d "$f" ] || echo "$f"; done'
Steeldriver
quelle
3

Eine andere Möglichkeit wäre, die Ausgabe von dpkgmit den Ergebnissen von findfor files zu vergleichen :

comm -12 \
   <(dpkg -L kate | sort ) \
   <(find $( dpkg -L kate ) -maxdepth 1 -type f | sort )
Fiximan
quelle
3

Mit Perl Oneliner:

dpkg -L elixir | perl -nE 'chomp; say unless -d'
  • dpkg -Llistet alle Dateien / Verzeichnisse im Paket auf und gibt sie an stdout aus
  • perl -nEiteriert den folgenden Perl-Code über jede dpkgAusgabezeile, wobei die aktuelle Zeile in der Standardargumentvariablen (aufgerufen $_) verbleibt.
  • chompEntfernt den nachfolgenden Zeilenvorschub aus stdin , sodass nur der Dateiname in der Standardargumentvariablen ( $_) verbleibt .
  • sayist die Abkürzung für say $_, die als Standardargument stdout gedruckt wird, wenn die folgende Bedingung erfüllt ist.
  • unless -d(kurz für unless -d $_) ist eine Bedingung für die vorherige sayund bedeutet, dass sie nur dann wahr ist, wenn der angegebene Dateiname kein Verzeichnis ist

Es werden also alle Dateinamen angezeigt, die keine Verzeichnisse sind. Wenn Sie nur Verzeichnisse angezeigt werden wollen, würden Sie ersetzen unlessmit if. Oder wenn Sie nur Symlinks möchten, können Sie diese -lanstelle von -dusw. verwenden (siehe man perlfuncfür weitere Details).

Matija Nalis
quelle
1
Dies ist mein neuer Favorit :)
Steeldriver
Ich mag das sehr.
Mydoghaswürmer