dhvlnyk
dhvlnyk

Reputation: 307

remove files which contain more than 14 lines in a folder

Unix command used

wc -l * | grep -v "14" | rm -rf

However this grouping doesn't seem to do the job. Can anyone point me towards the correct way? Thanks

Upvotes: 1

Views: 100

Answers (4)

nicky_zs
nicky_zs

Reputation: 3773

for f in *; do if [ $(wc -l $f | cut -d' ' -f1) -gt 14 ]; then rm -f $f; fi; done

Upvotes: 1

whereswalden
whereswalden

Reputation: 4959

There's a few problems with your solution: rm doesn't take input from stdin, and your grep only finds files who don't have exactly 14 lines. Try this instead:

find . -type f -maxdepth 1 | while read f; do [ `wc -l $f | tr -s ' ' | cut -d ' ' -f 2` -gt 14 ] && rm $f; done

Here's how it works:

find . -type f -maxdepth 1    #all files (not directories) in the current directory
[                             #start comparison
wc -l $f                      #get line count of file
tr -s ' '                     #(on the output of wc) eliminate extra whitespace
cut -d ' ' -f 2               #pick just the line count out of the previous output
-gt 14 ]                      #test if all that was greater than 14
&& rm $f                      #if the comparison was true, delete the file

I tried to figure out a solution just using find with -exec, but I couldn't figure out a way to test the line count. Maybe somebody else can come up with a way for it

Upvotes: 0

glenn jackman
glenn jackman

Reputation: 247012

wc -l * 2>&1 | while read -r num file; do ((num > 14)) && echo rm "$file"; done

remove "echo" if you're happy with the results.

Upvotes: 2

rici
rici

Reputation: 241861

Here's one way to print out the names of all files with at least 15 lines (assuming you have Gnu awk, for the nextfile command):

awk 'FNR==15{print FILENAME;nextfile}' *

That will produce an error for any subdirectory, so it's not ideal.

You don't actually want to print the filenames, though. You want to delete them. You can do that in awk with the system function:

# The following has been defanged in case someone decides to copy&paste
awk 'FNR==15{system("echo rm "FILENAME);nextfile}' *

Upvotes: 1

Related Questions