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
?
Asked
Active
Viewed 2,323 times
4

don_crissti
- 82,805

user785099
- 701
-
1See: http://unix.stackexchange.com/questions/18455/recursive-rename-files-and-directories/ – jasonwryan Oct 08 '11 at 22:02
-
@jasonwryan The first part is the same, but that one doesn't say anything about how to string-replace in a filename, so it probably makes sense to leave them separate – Michael Mrozek Oct 08 '11 at 23:05
-
@Michael You are right: I had conflated it with another question – jasonwryan Oct 08 '11 at 23:07
2 Answers
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"' {} \;

Gilles 'SO- stop being evil'
- 829,060