Change filenames recursively

Cameron Simpson cs at zip.com.au
Wed Jan 31 23:48:04 UTC 2007


On 31Jan2007 13:38, Stephen Carville <stephen at totalflood.com> wrote:
| Matthew Anderson wrote:
| >I have hundreds of files that start with a * (asterisk) for the
| >filename.  I am needing to change the asterisk in every file to a _
| >(underscore).  Does
| >
| >Anyone know what command I can use to recursively do that?  I appreciate
| >any help anyone can provide me.
| 
| Check out the 'find' command to locate the files.  Then pipe that that 
| thru a bit of Perl to create the commands.
| 
| $ ls test
| *one  *three  *two
| 
| $ find test -name "\**"|perl -e 
| 'foreach(<>){chomp$_;$aa=$_;$aa=~s/\*/_/;print"mv $_ $aa\n";}
| 
| mv test/*two test/_two
| mv test/*one test/_one
| mv test/*three test/_three
| 
| pipe to a shell for execution...

DON'T!

You need to escape the asterisk before doing this. And if the files have
funny chars you need to do more. A simplistic first cut would be to
generate commands like this:

  mv 'test/*two' 'test/_two'

Not perfect, but much much safer.

Then think about the consequences of renaming a directory during the
process (which your script will try to do as written).
-- 
Cameron Simpson <cs at zip.com.au> DoD#743
http://www.cskk.ezoshosting.com/cs/

BROCCOLI!! THE ONLY VEGETABLE THAT SOUNDS LIKE AN ADVERB!!
        - ken at aiai.ed.ac.uk (Ken Johnson)




More information about the redhat-list mailing list