0

I’m using ls -lR | ... to get my desired output, but now I need something that would force ls to ignore given regex expression. Is it possible to achieve this? I found ls -I and ls --ignore but for some reason I get: illegal option error [macOS Catalina 10.15.3]. I need this to be working on most frequently used shells(bash, ksh, zsh etc..)

Output

ls -lR | ...

./NOEMPTY:
total 72
-rw-r--r--@ 1 makaveli_10  staff  34 Mar 15 09:26 1b copy 10.c
-rw-r--r--@ 1 makaveli_10  staff  34 Mar 15 09:26 1b copy 15.c
-rw-r--r--@ 1 makaveli_10  staff  34 Mar 15 09:26 1b copy 20.c
-rw-r--r--@ 1 makaveli_10  staff  34 Mar 15 09:26 1b copy 25.c
-rw-r--r--@ 1 makaveli_10  staff  34 Mar 15 09:26 1b copy 30.c
-rw-r--r--@ 1 makaveli_10  staff  34 Mar 15 09:26 1b copy 35.c
-rw-r--r--@ 1 makaveli_10  staff  34 Mar 15 09:26 1b copy 40.c
-rw-r--r--@ 1 makaveli_10  staff  34 Mar 15 09:26 1b copy 5.c
-rw-r--r--@ 1 makaveli_10  staff  34 Mar 15 09:26 1b.c

./NOT_THIS:
total 32
-rw-r--r--@ 1 makaveli_10  staff  34 Mar 15 09:26 1b copy 30 2.c
-rw-r--r--@ 1 makaveli_10  staff  34 Mar 15 09:26 1b copy 30.c
-rw-r--r--@ 1 makaveli_10  staff  34 Mar 15 09:26 1b copy 35 2.c
-rw-r--r--@ 1 makaveli_10  staff  34 Mar 15 09:26 1b copy 35.c

./THIS_YES:
total 32
-rw-r--r--@ 1 makaveli_10  staff  34 Mar 15 09:26 1b copy 30 2.c
-rw-r--r--@ 1 makaveli_10  staff  34 Mar 15 09:26 1b copy 30.c
-rw-r--r--@ 1 makaveli_10  staff  34 Mar 15 09:26 1b copy 35 2.c
-rw-r--r--@ 1 makaveli_10  staff  34 Mar 15 09:26 1b copy 35.c

Desired Output:

ls -lR IGNORE NOT_THIS | ... something more
./NOEMPTY:
total 72
-rw-r--r--@ 1 makaveli_10  staff  34 Mar 15 09:26 1b copy 10.c
-rw-r--r--@ 1 makaveli_10  staff  34 Mar 15 09:26 1b copy 15.c
-rw-r--r--@ 1 makaveli_10  staff  34 Mar 15 09:26 1b copy 20.c
-rw-r--r--@ 1 makaveli_10  staff  34 Mar 15 09:26 1b copy 25.c
-rw-r--r--@ 1 makaveli_10  staff  34 Mar 15 09:26 1b copy 30.c
-rw-r--r--@ 1 makaveli_10  staff  34 Mar 15 09:26 1b copy 35.c
-rw-r--r--@ 1 makaveli_10  staff  34 Mar 15 09:26 1b copy 40.c
-rw-r--r--@ 1 makaveli_10  staff  34 Mar 15 09:26 1b copy 5.c
-rw-r--r--@ 1 makaveli_10  staff  34 Mar 15 09:26 1b.c

./THIS_YES:
total 32
-rw-r--r--@ 1 makaveli_10  staff  34 Mar 15 09:26 1b copy 30 2.c
-rw-r--r--@ 1 makaveli_10  staff  34 Mar 15 09:26 1b copy 30.c
-rw-r--r--@ 1 makaveli_10  staff  34 Mar 15 09:26 1b copy 35 2.c
-rw-r--r--@ 1 makaveli_10  staff  34 Mar 15 09:26 1b copy 35.c

I’ve tried to use sed utility but failed to achieve this, since I wasn’t able to select empty line between folders such as this: ls -lR | sed -n '/.\/NOT_THIS/,/[[:space:]]/p'

Makaveli_O
  • 29
  • 5
  • What do you want to do with this output in the end? You would probably be better off using a shell loop, as parsing `ls` is problematic at best. – Tom Fenech Mar 16 '20 at 08:59
  • I’m doing file size histogram, and it’s working fine, but I have to implement -i option, that will ignore given pattern. Why is it so problematic? – Makaveli_O Mar 16 '20 at 09:11
  • 1
    https://mywiki.wooledge.org/ParsingLs explains some of the issues. A very broad overview would be that the output of `ls` varies depending on the platform, and spaces or other inconvenient characters in file names can cause problems. If you provide some more details about how you use the output (do you just need the file sizes?) then we can recommend a more appropriate tool. – Tom Fenech Mar 16 '20 at 09:30

1 Answers1

1

Try this : ls -lR -I '*NOT_THIS*'

Demo :

:=>ls -1
1.txt
2.txt
a.csv
b.csv
:=>ls -1 -I '*txt'
a.csv
b.csv
:=>

Using SED

sed '/\.\/NOT_THIS/, /^$/'d

explanation : sed '/start/,/end/d' <-- this will delete all data between first /<patern>/ and second pattern.

^$ <-- Blank line. ^ -- Start of record. $ -- end of record

Demo:

:=>sed '/\.\/NOT_THIS/, /^$/'d file.txt
ls -lR | ...

./NOEMPTY:
total 72
-rw-r--r--@ 1 makaveli_10  staff  34 Mar 15 09:26 1b copy 10.c
-rw-r--r--@ 1 makaveli_10  staff  34 Mar 15 09:26 1b copy 15.c
-rw-r--r--@ 1 makaveli_10  staff  34 Mar 15 09:26 1b copy 20.c
-rw-r--r--@ 1 makaveli_10  staff  34 Mar 15 09:26 1b copy 25.c
-rw-r--r--@ 1 makaveli_10  staff  34 Mar 15 09:26 1b copy 30.c
-rw-r--r--@ 1 makaveli_10  staff  34 Mar 15 09:26 1b copy 35.c
-rw-r--r--@ 1 makaveli_10  staff  34 Mar 15 09:26 1b copy 40.c
-rw-r--r--@ 1 makaveli_10  staff  34 Mar 15 09:26 1b copy 5.c
-rw-r--r--@ 1 makaveli_10  staff  34 Mar 15 09:26 1b.c

./THIS_YES:
total 32
-rw-r--r--@ 1 makaveli_10  staff  34 Mar 15 09:26 1b copy 30 2.c
-rw-r--r--@ 1 makaveli_10  staff  34 Mar 15 09:26 1b copy 30.c
-rw-r--r--@ 1 makaveli_10  staff  34 Mar 15 09:26 1b copy 35 2.c
-rw-r--r--@ 1 makaveli_10  staff  34 Mar 15 09:26 1b copy 35.c
:=>

Digvijay S
  • 2,665
  • 1
  • 9
  • 21
  • This would work fine, however it delete everything until the end Am I right? I gave wrong example. After ./NOT_THIS there can be another folder, ./THIS_YES, and it will be deleted as well. – Makaveli_O Mar 16 '20 at 09:21
  • 1
    `sed '/\.\/NOT_THIS/, /^$/'d ` this will work for updated example – Digvijay S Mar 16 '20 at 09:25