Search code examples
unixsedfindexecfile-rename

How to rename multiple files in several folders?


I'd like to rename all files in several folders with filename containing '*file*' by '*doc*'. I've tried

find . -name "*file*" -exec mv {} `echo {} | sed "s/file/doc/"` \;

but got an error (see below).

~$ ls
my_file_1.txt  my_file_2.txt  my_file_3.txt

~$ find . -name "*file*"
./my_file_1.txt
./my_file_3.txt
./my_file_2.txt

~$ echo my_file_1.txt | sed "s/file/doc/"
my_doc_1.txt

~$ find . -name "*file*" -exec echo {} \;
./my_file_1.txt
./my_file_3.txt
./my_file_2.txt

~$ find . -name "*file*" -exec mv {} `echo {} | sed "s/file/doc/"` \;
mv: './my_file_1.txt' and './my_file_1.txt' are the same file
mv: './my_file_3.txt' and './my_file_3.txt' are the same file
mv: './my_file_2.txt' and './my_file_2.txt' are the same file

Many thanks for your help!


Solution

  • There are a thousand ways to do it, I'd do it with Perl, something like this will work:

    find files -type f -name "file*" | perl -ne 'chomp; $f=$_; $f=~s/\/file/\/doc/; `mv $_  $f`;'
    
    • -ne process as inline script for each line input
    • chomp clean a newline
    • $f is new filename, same as old filename
    • s/\/file/\/doc/ replace "/file" with "/doc" in the new filename
    • mv $_ $f rename the file by running an OS command with back ticks