Take the 2-minute tour ×
Server Fault is a question and answer site for professional system and network administrators. It's 100% free, no registration required.

I had a group of files that I'd like to consistently rename, the files are named things like

"System-Log-01-01-2009-NODATA.txt"
"Something-Log-01-01-2009-NODATA.txt"

And I wanted them as lowercase, yyyymmdd, .log extension

"system.20090101.log"
"something.20090101.log"
share|improve this question

5 Answers 5

up vote 9 down vote accepted

I used to write perl scripts to do this, until I discovered the rename command.

It accepts a perl regex to do the rename:

for this, I just typed two commands:

rename 's/(\w+)-(\w+)-(\d\d)-(\d{4})-NODATA.txt\$1.$4$3$2.log$//' *
rename 'y/A-Z/a-z/' *.log
share|improve this answer
    
very nice answer –  Judioo May 7 '09 at 10:11
4  
Beware, some distros ship a worthless rename command. Check which one your distro has first. –  derobert May 7 '09 at 16:24
    
I knew mmv but eventually thanks to rename I can use the power of regex –  Ludovic Kuty Jan 13 at 10:49
    
On Arch Linux this is perl-rename. –  Oleh Prypin Nov 27 at 11:48

mmv is a standard linux utility to move/rename multiple files. It is available from the repos for most distributions. For your example above, you could do:

mmv *-Log-*-*-*-NODATA.txt #l1.#4#3#2.log

For more information, read this debaday article or the man page.

share|improve this answer

rename util is not very "standard". Each distro ships with a different rename tool. For instance, here on Gentoo, rename is from sys-apps/util-linux package and does not support regex.

Hamish Downer suggested mmv, it seems useful, specially for use inside scripts.

On the other hand, for the general case, you might want renameutils. It has qmv and qcp commands, which will open a text editor of your choice (my preference: Vim) and allow you to edit the destination filenames there. After saving and closing the editor, qmv/qcp will do all the renaming.

Both mmv and qmv are smart enough to rename files in correct order and also to detect circular renames, and will automatically make a temporary file if needed.

share|improve this answer
    
On Gentoo you can also emerge the sys-apps/rename package, which gives you renamexm which will do regex renaming as well as mass upper/lowercase and other nice things. –  radicand Jun 12 '13 at 4:21

Since i don't have a rename command, i am relying on this:

for myfile in /my/folder/*; do
    target=$(echo $myfile|sed -e 's/foo/bar/g')
    mv "$myfile" "$target"
done
share|improve this answer

To be fair:

rename 's/(\w+)-(\w+)-(\d\d)-(\d{4})-NODATA.txt\$1.$4$3$2.log$//' *.txt

gives this output:

Use of uninitialized value $4 in regexp compilation at (eval 1) line 1.
Use of uninitialized value $3 in regexp compilation at (eval 1) line 1.
Use of uninitialized value $2 in regexp compilation at (eval 1) line 1.

But:

rename -n 's/(\w+)-\w+-(\d{2})-(\d{2})-(\d{4})-NODATA\.txt$/$1.$4$3$2\.log/' *.txt && rename 'y/A-Z/a-z/' System.20090101.log

gives the right output:

System-Log-01-01-2009-NODATA.txt renamed as System.20090101.log
System.20090101.log renamed as system.20090101.log

replacing {-n} switch with {-v}

share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

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