---
name: "pacsift"
section: "1"
platform: "linux"
package: "pacutils"
version: "0.15.0-2"
release: "Arch Linux 2026-11-01"
platforms: ["linux"]
url: "https://new.carta.tech/pacsift"
---

# pacsift(1)

query and filter packages

## NAME

pacsift - query and filter packages

## SYNOPSIS

```
 pacsift [options] (<field> <term>)...
 pacsift (--help|--version)
```

## DESCRIPTION

By default the intersection of matched packages are returned.  If a field is provided multiple times the union of matches will be used for that field.

If *stdin* is not connected to a terminal, packages to filter will be read from *stdin*.

Combine with **pacinfo** to display brief package information similar to `"pacman -Qs"` and `"pacman -Ss"`:

```
 pacsift --name pacman | pacinfo --short
```

## OPTIONS

- **--config**=*path*

  Set an alternate configuration file path.

- **--dbext**=*extension*

  Set an alternate sync database extension.

- **--dbpath**=*path*

  Set an alternate database path.

- **--root**=*path*

  Set an alternate installation root.

- **--sysroot**=*path*

  Set an alternate system root.  See [**pacutils-sysroot**(7)](/pacutils-sysroot/7.md).

- **--null**\[=*sep*\]

  Set an alternate separator for values parsed from *stdin*.  By default a newline `"\n"` is used as the separator.  If **--null** is used without specifying *sep* `"NUL"` will be used.

- **--exists**

  Exit with a non-zero value if no matches are found.

- **--not-exists**

  Exit with a non-zero value if matches are found.

- **--invert**

  Return packages that **DO NOT** match the provided search terms.

- **--any**

  Return the union of matched packages rather than the intersection.

- **--exact**

  Match values exactly.

- **--regex**

  Treat string values as extended case-insensitive regular expressions.

- **--help**

  Display usage information and exit.

- **--version**

  Display version information and exit.

### Filters

Filters limit the initial set of packages to be searched.  They may not be used if packages are provided on *stdin* and they are not affected by **--invert** or **--any**.

- **--local**

  Search locally installed packages.  Similar to:\
    pacsift --repo=local \| pacsift ...

- **--sync**

  Search packages in sync databases.  Similar to:\
    pacsift --invert --repo=local \| pacsift ...

- **--cache** (**EXPERIMENTAL**)

  Search packages in cache directories.

### String Fields

By default string fields will use a case-insensitive substring search.  If **--exact** is used string fields must match *val* exactly.  If `"--regex"` is used *val* will be used as an extended case-insensitive regular expression.

- **--repo**=*val*

  - **--name**=*val*

  - **--base**=*val*

  - **--description**=*val*

  - **--packager**=*val*

  - **--group**=*val*

  - **--owns-file**=*path*

  File paths must match the package database; no attempt is made to resolve the provided path.  **Note:** when used with **--exact** the installation root will be removed from *path* if present, otherwise *path* will be used exactly as provided.  May be used with **realpath** or **which** to more easily search for the owner of installed files:

  ```
   pacsift --local --exact --owns-file="$(which pacsift)"
  ```

- **--license**=*val*

  - **--url**=*val*

  ### Dependency Fields

Dependencies may be specified in the format `"<pkgname>[<cmp><version]"`. `"cmp"` may be any of the following: `"="`, `"<"`, `"<="`, `">"`, `">="`.  If `"version"` is provided the package dependency must be an exact match to the search term.  If `"version"` is omitted only `"pkgname"` will be compared unless **--exact** is used.  If `"--exact"` is used and `"version"` is not provided only dependencies with no version specified will be matched.

Dependency fields are not affected by **--regex**.

- **--provides**

  - **--conflicts**

  - **--replaces**

  - **--depends**

  - **--optdepends**

  ### Size Fields

Size fields may be prefixed with any of the following comparisons: `"="`, `"!="`, `"<"`, `"<="`, `">"`, `">="`.  If no comparison is provided `"="` will be used.  The size may be followed by abbreviated unit.  Units are case-sensitive.

- **--size**

  - **--installed-size**

  - **--download-size**

  ### Date Fields

Date fields may be prefixed with any of the following comparisons: `"="`, `"!="`, `"<"`, `"<="`, `">"`, `">="`.  If no comparison is provided `"="` will be used.  Dates may be provided as seconds since the epoch or any of the following `"strptime"` formats: `"%Y-%m-%d"`, `"%Y-%m-%d %H:%M"`, `"%Y-%m-%d %H:%M:%S"`.

- **--install-date**

  - **--build-date**

  ### Other

- **--satisfies**=*dependency*

  Search for packages that satisfy *dependency*.

## EXAMPLES

- Find broken packages:

  ```
   pacsift --packager allan
  ```

- Find large installed packages:

  ```
   pacsift --local --size '>1.5GB'
  ```

- Find packages with either "pacman" or "alpm" in their description:

  ```
   pacsift --description pacman --description alpm
  ```

- Find packages with both "pacman" and "alpm" in their description:

  ```
   pacsift --description pacman | pacsift --description alpm
  ```

- Check if a package is installed:

  ```
   pacsift --local --exists --satisfies pacman && echo "pacman is installed"
  ```

## CAVEATS

**pacsift** determines whether or not to read packages from *stdin* based on a naive check using [**isatty**(3)](/isatty/3.md).  If **pacsift** is called in an environment, such as a shell function or script being used in a pipe, where *stdin* is not connected to a terminal but does not contain packages to filter, **pacsift** should be called with *stdin* closed.  For POSIX-compatible shells, this can be done with `"<&-"`.
