4

There exists a directory, which includes several levels of sub-directories. Under these directories, there are a set of files whose names include a common word, e.g, .cc. How can I replace the .cc in the names of these files with .cpp?

don_crissti
  • 82,805

2 Answers2

3

When you say the files "names include a common word," I am assuming that you are referring to the fact that they share the .cc extension: if so, using Gilles' answer here you could construct a command that would achieve your goal:

 find -type f -exec sh -c '
    for file; do [ "${file##*.}" = "cc" ] && 
    mv -- "$file" "${file%.cc}.ccp"; done
    ' -- {} +

See this answer on SO for more detail

jasonwryan
  • 73,126
3

In zsh:

autoload zmv
zmv '(**/)(*).cc' '$1$2.cpp'

In bash ≥4:

for x in **/*.cc; do mv "$x" "${x%.cc}.cpp"; done

In any shell:

find -name '*.cc' -exec sh -c 'for x; do mv "$x" "${x%.cc}.cpp"; done' _ {} +

Simpler, and portable to older systems, but slightly slower:

find -name '*.cc' -exec sh -c 'mv "$0" "${0%.cc}.cpp"' {} \;

See this answer for explanations.