Select Targets for Bash Command

This post introduces how apply Linux commands to selective targets.

First of all are the well-known wildcards:

  • ? for one any character
  • * for zero or more characters

Next is to select few targets (without common pattern in names) by brackets, for example:

ls -l {foo,bar}

It is also possible to use it for part of the name as well as with wildcards together as shown in following example:

ls -l test{???,color}.cpp

And couple more advanced examples on nesting and listing:

mkdir -pv /{media/{floppy,cdrom},sbin,srv,var}
mkdir -pv /usr/{,local/}share/man/man{1..8}

The former has outer brackets, while makes 4 directories (sbin, srv, var, and media) in the root partition, and inner brackets for floppy, cdrom under /media. The second example command summarizes man1, man2 until man8 with man{1..8}. It is also worth mention that {,local/} is how to get both of the paths with or without local/ in between.

In addition, reverse selection is achieved by !. The following command list all the files with .cpp suffix except those contain exactly 4 characters or _ in the basename:

ls -l !(????|*_*).cpp

Note, you may need to enable this by command:

shopt -s extglob

Credits