2013-02-21 3 views
8

Это должно быть относительно тривиально, но я пробовал какое-то время без большой удачи. У меня есть каталог со многими каталогами, каждый со своей структурой и файлами.Найти файлы, переименовать на место unix bash

Я ищу, чтобы найти все файлы .java в любом каталоге под рабочим каталогом и переименовать их в определенное имя. Например, я хотел бы назвать все java-файлы «test.java».

Если структура каталогов:

./files/abc/src/abc.java 
./files/eee/src/foo.java 
./files/roo/src/jam.java 

Я хочу просто переименовать:

./files/abc/src/test.java 
./files/eee/src/test.java 
./files/roo/src/test.java 

Конечно, часть моей проблемы заключается в том, что пути могут иметь пробелы в Я надеваю. 't нужно беспокоиться о переименовании классов или что-либо внутри файла, просто имя файла на месте.

Если в каталоге имеется более 1 .java-файла, я не против, если он будет перезаписан или вам будет предложено выбрать, что делать (либо это нормально, маловероятно, что их больше 1 в каждом каталоге

то, что я пытался:.

Глядя в мв и найти, но когда я труба их вместе, я, кажется, делают это неправильно, я хочу, чтобы убедиться, чтобы сохранить их в своем текущем местоположении и переименовать и не перемещать.

Спасибо, я очень признателен за любую помощь.

ответ

21

Версия GNU find имеет действие -execdir, которое меняет каталог везде, где находится файл.

find . -name '*.java' -execdir mv {} test.java \; 

Если ваша версия find не поддерживает -execdir, то вы можете получить работу с:

find . -name '*.java' -exec bash -c 'mv "$1" "${1%/*}"/test.java' -- {} \; 
+0

Как читать бит '' $ {1%/*} "/ test.java'? – dumbledad

+1

Переменная '$ 1','% 'удаляет кратчайший суффикс соответствия'/* '- он удаляет имя файла из' $ 1', например 'dirname '$ 1" '. '/ test.java' добавляется к этому имени каталога. –

5

Если find команда (как у меня) не поддерживает -execdir, попробуйте следующее :

find . -name "*.java" -exec bash -c 'mv "{}" "$(dirname "{}")"/test.java' \; 
+0

Это будет безопаснее для имен файлов с кавычками: '-exec bash -c 'mv" $ 1 "$ (dirname" $ ​​1 ")/test.java' - {} \;' –

Смежные вопросы