What is the best way how to empty a bunch of files in bash? As far I've been doing this

echo "" > development.log
echo "" > production.log

I don't really want to delete those files, so rm is not possible. I've tried many things like

echo "" > *.log

but nothing worked.


You don't need the echo. Just


will empty the file. To edit rassie...

for FILE in *.log

The quotes and brackets are preferred, as they will correctly handle files with spaces or special characters in them.

  • 1
    The one in the loop creates a file called {FILE}. The first quotation mark needs to go before the dollar sign instead of after. Sep 9 '09 at 16:09
  • Gak! Typo fixed.
    – kmarsh
    Sep 9 '09 at 17:43

Just for fun, another variation combining Eric Dennis' find with everybody else's redirection:

find . -name "*.log" -exec sh -c ">{}" \;
for i in *.log; do > $i; done

Note that if you really want the files to be emptied you have to use no echo at all, see above, or pass echo the -n flag (echo -n)

for i in *.log; do cp /dev/null $i; done

Or, if you want to recurse:

find . -name "*.log" -exec cp /dev/null {} \;
  • 1
    you miss a ". ( 15 chars here :) )
    – drAlberT
    Sep 9 '09 at 15:52
  • 1
    after log Sep 9 '09 at 16:11

A loop could do:

for i in *.log; do echo "" > $i; done
  • 5
    We should be using echo with the -n flag to prevent putting a useless \n at the top of the file. Sep 9 '09 at 15:18


echo -n | tee *.log


echo -n echoes an empty string to stdout; while tee *.log writes stdout to mutiple files with widecard like you wished.


This will also work.

find *.txt | awk '{print " " > $1}'

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.