This should be relatively trivial but I have been trying for some time without much luck. I have a directory, with many sub-directories, each with their own structure and files.
I am looking to find all .java
files within any directory under the working directory, and rename them to a particular name.
For example, I would like to name all of the java files test.java
.
If the directory structure is a follows:
./files/abc/src/abc.java
./files/eee/src/foo.java
./files/roo/src/jam.java
I want to simply rename to:
./files/abc/src/test.java
./files/eee/src/test.java
./files/roo/src/test.java
Part of my problem is that the paths may have spaces in them. I don't need to worry about renaming classes or anything inside the files, just the file names in place.
If there is more than one .java
file in a directory, I don't mind if it is overwritten, or a prompt is given, to choose what to do (either is OK, it is unlikely that there are more than one in each directory.
What I have tried:
I have looked into mv
and find
; but, when I pipe them together, I seem to be doing it wrong. I want to make sure to keep the files in their current location and rename, and not move.
The GNU version of find
has an -execdir
action which changes directory to wherever the file is.
find . -name '*.java' -execdir mv {} test.java \;
If your version of find
doesn't support -execdir
then you can get the job done with:
find . -name '*.java' -exec bash -c 'mv "$1" "${1%/*}"/test.java' -- {} \;