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.

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.


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'

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 )

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).


1
Dies ist mein neuer Favorit :)
Steeldriver

Ich mag das sehr.
Mydoghaswürmer
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.