I would like to run ls and exclude certain files in the output.

When I run the following command, I get all files with each on one line:

$ ls -1

I would like to run this command in a way so it shows

$ ls -1 <insert magic here> temp
ls -I <filename>

-I = Ignore the filename, i.e., don't list the specified file.

To ignore more than one file add an -I before each filename.

ls -I file1 -I file2

To ignore files by their name extensions do the following, for example.

ls -I "*.jpg" -I "*.svg"
  • 4
    If you use the long-form option --ignore you can extend that to glob patterns e.g. ls --ignore="file?" or ls --ignore="file*" – steeldriver Aug 18 '14 at 15:23
  • 3
    you can use glob patterns with the short form as well by quoting the patterns – verboze Dec 29 '15 at 5:42
  • you can even use glob patterns without quotes, but by escaping the special letters: ls -I \*.jpg (tested in bash) – HongboZhu Jan 15 at 13:46

For me if I use -I once, it works but if I use twice it doesn't. e.g: ls -I *.csv works.

But ls -I *.csv -I *.txt doesn't work and returns txt files instead.

--ignore did the trick for me. This is what I needed and worked.

ls -lhrt --ignore="*.gz" --ignore="*.1"

That will list me files from log folder where it exclude old backup logs.

  • 3
    quoting *.csv in the first form works, e.g.., ls -I '*.txt'. The reason it doesn't work unquoted is because of shell expansion, i.e. you're telling the shell to list all csv files instead of excluding them. What's actually happening is that it ignores the first .csv and .1 files after expansion, but lists the remainders – verboze Dec 29 '15 at 5:40
  • Double-quoting worked for me as well. Thanks @verboze – user38537 Sep 29 '16 at 20:41
  • this is easier. Thanks. – Philippe Delteil Mar 6 '19 at 18:08

ls --ignore={"*.jpg","*.png","*.svg"}

  • 4
    This is simply using bash's brace expansion to get three --ignore options. You could have also used --ignore="*."{jpg,png,svg} – muru Feb 14 '17 at 0:27

I think that this produces the output you're looking for:

ls -1 !(temp)

Apparently, you need shopt -s extglob for that to work
(I have it enabled, so I guess some time in the distant past I found it useful and enabled it).

I guess you could also use grep to filter the output:

ls -1 | grep -v '^temp$'

Using a pipe and filters provides a lot more flexibility, and skills that are transferable to other commands/situations, though you might not be interested in that for this specific case.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.