10

I have directory with files from 2010 year.. I want to delete all files older than 500 days and I tried this:

find /var/log/arc/* -type f -mtime +500 -delete {}\;      

But I get this:

-bash: /usr/bin/find: Argument list too long

As I know this means that there are too many files and find can't handle them. But even if I put +2000 which is 3+ years I still getting this.

What I'm missing here?

Gilles 'SO- stop being evil'
  • 807,993
  • 194
  • 1,674
  • 2,175
S.I.
  • 435
  • 3
  • 7
  • 16

1 Answers1

18

You're missing that find doesn't need a list of files as input. The problem is that the glob /var/log/arc/* expands to too many files. However, find will recurse into subdirectories by default, so there's no need to use the glob at all:

find /var/log/arc/ -type f -mtime +500 -delete

-delete is a non-standard predicate. If your find implementation doesn't support it, you can use:

find /var/log/arc/ -type f -mtime +500 -exec rm -f {} +

instead.

Stéphane Chazelas
  • 522,931
  • 91
  • 1,010
  • 1,501
terdon
  • 234,489
  • 66
  • 447
  • 667
  • Thank's but now got this: `find: invalid predicate `-delete'` – S.I. Jul 29 '16 at 11:42
  • 1
    @Garg first, sorry, I just copied your command and hadn't noticed your syntax is wrong. The `-delete` doesn't take `{}`. See update. However, your error message seems to suggest that your version of `find` doesn't support `-delete`. If you're not using GNU `find` (which in most cases you won't unless you're using Linux), you need to use `-exec -rm {} \;` instead. – terdon Jul 29 '16 at 11:47
  • Thank you. `-exec rm {} \;` do the trick. – S.I. Jul 29 '16 at 11:52
  • 1
    @hobbs I don't see why not, `-exec` is [defined by POSIX](http://pubs.opengroup.org/onlinepubs/009695399/utilities/find.html). – terdon Jul 29 '16 at 18:35
  • @terdon my mistake. – hobbs Aug 03 '16 at 22:05