1

How can I modify the pattern in the second instruction, so as to exclude nested directories? (such that ls returns only foo.mp4, not the content of bar:).

$ ls *
foo.mp4 foo.ogg

bar:
bar.ogg
$ shopt -s extglob
$ ls !(*.ogg)
foo.mp4

bar:
bar.ogg

PS: I use OS X.

  • 1
    ls does not automatically descend into subdirectories. Have you created an alias or function? What is the output of type -a ls? – glenn jackman Sep 11 '16 at 15:21
  • $ type -a ls ls is /bin/ls – Erwann Sep 12 '16 at 0:19
  • Oh right. ls * will descend because you're explicitly naming the directory. My bad. Plain ls with no arguments will not – glenn jackman Sep 12 '16 at 0:21
3

Use find rather than ls. With find you can exclude one or more glob-expressions. For your example (and OSX), you could do

find * -depth 0 -type f ! -name '*.ogg'  -ls

which produces something like an ls -l (on just files, given the -type f):

66294163        0 -rw-r--r--    1 tom              wheel                   0 Sep  9 20:12 foo.mp4

With OSX, the first column is the inode value, and then the link-count. find does not provide as many options for listing as ls:

$ ls -l
total 0
drwx------  3 thomas  wheel  102 Sep  9 15:33 com.apple.launchd.OFStJ79qtq
drwx------  3 thomas  wheel  102 Sep  9 15:33 com.apple.launchd.VQsV1ae6bI
drwx------  3 thomas  wheel  102 Sep  9 15:33 com.apple.launchd.e6HBMt2vnS
drwx------  3 thomas  wheel  102 Sep  9 15:33 com.apple.launchd.he9U4OAIMI
-rw-r--r--  1 tom     wheel    0 Sep  9 20:12 foo.mp4
-rw-r--r--  1 tom     wheel    0 Sep  9 20:12 foo.ogg

but can be useful.

  • Came here to recommend find with the ! bang operator for logical NOT. Have an upvote. – Matt Obert Sep 10 '16 at 1:55
0

What was I thinking?!

$ ls *.!(ogg)
foo.mp4

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.