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
  • 79,330
  • 30
  • 216
  • 245
user785099
  • 701
  • 2
  • 8
  • 11

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
  • 71,734
  • 34
  • 193
  • 226
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.

Gilles 'SO- stop being evil'
  • 807,993
  • 194
  • 1,674
  • 2,175