How do I get a list of only the files (not the directories) from a package?

It should be possible with xargs plus a shell test, for example

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

Simply loop over each line of dpkg -L elixir and test whether the line is the path of a regular file, then echo it:

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

Your idea with find looks good but find

  1. does not accept stdin and
  2. searches in the given path while you want to just check properties of the single given path,

so it’s not the right tool here.


With perl oneliner:

dpkg -L elixir | perl -nE 'chomp; say unless -d'
  • dpkg -L will list all files/directories in package and output it to stdout
  • perl -nE will iterate following perl code over each line of dpkg output, leaving current line in default argument variable (called $_)
  • chomp removes trailing linefeed from stdin, thus leaving only filename in default argument variable ($_).
  • say is short for say $_, which will print to stdout default argument if following condition is true.
  • unless -d (short for unless -d $_) is condition for previous say, and means it will only be true if specified filename is not a directory

So, it will display all filenames which are not directories. If you wanted to display only directories, you would replace unless with if. Or if you wanted only symlinks, you could use -l instead of -d, etc. (see man perlfunc for more details)