3

I have log files in a folder. These files after some size are creating a new file old_name.log1 and writing to it.

Now there are many files and I can't clear them one by one. I want to delete old_name.log1, old_name.log2 etc and clear old_name.log.

The file_name can be anything. But the file ends with .log and it's extended files ends with .log1, .log2, etc. How to do it?

3 Answers3

6

Note that OP apparently wants to truncate files. In such case, the desired command is

find /path/to/dir -regextype sed -regex ".*\.log[1-9]*" -exec truncate -s 0 {} \;

Alternatively, in bash

shopt -s globstar
truncate -s 0 **/*.log[1-9]

If you want to clear out any file that has .log in the name

find /path/to/dir -name "*.log*"

If you target .log[digit] specifically, use

find /path/to/dir -regextype sed -regex ".*\.log[1-9]*"

Once you verify either of these two commands find the files you want, append -delete to the command for actual removal

Sergiy Kolodyazhnyy
  • 105,154
  • 20
  • 279
  • 497
  • How to clear these files using the command line? I know how to find. To clear a single file I would use > old_name.log But I want to clear multiple files instead of typing each one of their names. – Sreekanth Reddy Balne Feb 07 '19 at 20:03
  • 1
    @Shameless Please read the last sentence in my answer. find with -delete option does exactly what you ask. Full command is find /path/to/dir -regextype sed -regex ".*\.log[1-9]*" -delete . It's common practice to first list files, then delete them to avoid unintended errors. – Sergiy Kolodyazhnyy Feb 07 '19 at 20:08
  • 1
    @Shameless If by clear you mean "keep filename, but delete contents", then you want find /path/to/dir -regextype sed -regex ".*\.log[1-9]*" -exec truncate -s 0 {} \; – Sergiy Kolodyazhnyy Feb 07 '19 at 20:17
6

To delete .log1, .log2, etc. files:

rm *.log[1-9]*
  • rm - Delete files
  • *.log[1-9]* - All files in the current directory that contain .log followed by a digit 1-9 then anything else

To test the command before running it, replace the rm with echo. It will print the matching files.

To truncate .log files:

echo -n | tee *.log
  • echo -n - Print nothing
  • tee *.log - Write from stdin to all .log files in the current directory
wjandrea
  • 14,236
  • 4
  • 48
  • 98
  • How to clear these files using the command line? I know how to find. To clear a single file I would use > old_name.log But I want to clear multiple files instead of typing each one of their names. – Sreekanth Reddy Balne Feb 07 '19 at 20:03
  • @Shameless Oh, I thought "clear" meant "delete". Usually I've heard emptying a file called "erasing" or maybe "zeroing" or "wiping". I'll revise the answer to do that. – wjandrea Feb 07 '19 at 20:12
  • 1
    @wjandrea this won't work right. Your rm code won't delete log files named .log.01, .log.02, etc. Your tee code won't get ANY log files with any names like .log.1, .log.01, etc. And, you don't want to touch any *.log file, as it's probably an open active file. – heynnema Feb 08 '19 at 15:59
  • @heynnema You're totally right. My answer is meant to answer the question exactly as asked, regardless of effects. I don't know enough about log files to really comment on it anyway. – wjandrea Feb 08 '19 at 16:06
  • Comments are not for extended discussion; this conversation has been moved to chat. – Seth Feb 09 '19 at 00:57
4

Quick and dirty... assuming that you have permissions for these log files and directory itself... and you wish to delete the .log* files...

  1. in a Files window, open the directory where the log files are located
  2. search for .log files
  3. Select All, control-click any files to exclude (like the active and open *.log)
  4. then Move to Trash

Note: if you wish to "clear" the .log file, close the application that makes the current .log file, then delete the current .log file with Move to Trash, and then right-click in the folder, select New Document, then Blank Document, and Rename... using the correct .log filename.

heynnema
  • 70,711