4

My computer at work has a tendency to generate an excessive amount of core files, which can be useful for debugging, but slowly take up all of the available space on my computer. I made this command to delete all the core files, given that they all start with "core."

locate /core. | grep -v core.h | grep -v core.c | grep -v core.py \
  | grep -v core.xml | grep -v core.txt | grep -v .gz \
  | grep -v core.so | grep -v chrome |sudo xargs rm

It works, but it's unwieldy and would delete say core.sh if that file existed on my computer. I think a better way would be:

  1. Use locate to find all the files starting with "core."
  2. Feed that list into file
  3. Make a list out of everything that file says is a core file. Assuming that a file is a core file if and only if the output of file file_name contains the phrase "ELF 64-bit LSB core file x86-64".
  4. Feed that to sudo xargs rm

But I don't know how to step three in that list.

Joshua Snider
  • 193
  • 1
  • 1
  • 9
  • 1
    I would advise you to read through the manpage of `find` and use that instead of `locate` for [several reasons](http://askubuntu.com/q/671741/367990). With `find` you can probably do everything at once. And please if you want to use `file` to check the type, provide us an example output of `file` that shows one of those core files you want to delete. – Byte Commander Sep 10 '15 at 19:30
  • Assume that file_name is a core file if and only if the output of `file file_name` contains the words "ELF 64-bit LSB core file x86-64". – Joshua Snider Sep 10 '15 at 19:41
  • You should [edit] your question to include this information. – Byte Commander Sep 10 '15 at 19:44
  • @ByteCommander: It is done. – Joshua Snider Sep 10 '15 at 19:46
  • Sooo . . . .from reading your line you seem to avoid deleting any *.c, *.py, *.xml files . . .The `-v` flag means reverse matching, i.e., ignore those extensions. Perhaps it would be more efficient to define which exact files you do want to keep – Sergiy Kolodyazhnyy Sep 10 '15 at 20:41
  • @Serg: I'm not sure what you mean by that. Currently, I'm exhaustively listing all of the files that I know I want to keep, but it's not very elegant. – Joshua Snider Sep 10 '15 at 21:20
  • Err, fix the crashing programs? DIsable coredumps? `man setrlimit`, `man bash` – waltinator Sep 18 '15 at 22:16
  • @waltinator: Those are good options, but not the right fit in my use case. – Joshua Snider Sep 21 '15 at 02:22

3 Answers3

1

I have been using Linux every since Hardy Heron and I stumbled upon this one line script which will remove core dump files cleanly and safely. I don't remember where I originally found it, but it works great. Type the following line as super user of course:

find / -type f -name core -atime +1 -exec rm {} \;

That's it. Very simple and with proper substitution can be used to remove /tmp and /var/tmp files. The -atime attribute is variable so you can decide how many days of files you want to keep or not. Always try the simple solutions first.

andrew.46
  • 37,085
  • 25
  • 149
  • 228
0

Combining the two answers:

find / -type f -name core -atime  -exec file {} \; | grep "ELF 64-bit LSB core file x86-64".
FloT
  • 2,256
  • 4
  • 13
  • 29
0

I ended up doing it myself in python.

#!/usr/bin/env python2

from subprocess import PIPE, Popen

def is_core_file(filepath):
  ''' Use file command to determine if something is an actual core file.'''
  prog = Popen(["file", filepath], stdin=PIPE, stdout=PIPE)
  out = prog.communicate()[0]
  return "core file" in out

def main():
  prog = Popen(["sudo", "updatedb"], stdin=PIPE, stdout=PIPE)
  prog.communicate()
  prog = Popen(["locate", "/core."], stdin=PIPE, stdout=PIPE)
  cores = prog.communicate()[0].split('\n')
  for core in cores:
    if is_core_file(core):
      print("deleting " + core)
      prog = Popen(["sudo", "rm", "-f", core])

if __name__ == '__main__':
  main()

Edited to use main.

Joshua Snider
  • 193
  • 1
  • 1
  • 9