2013-02-21 7 views
8

To powinno być względnie banalne, ale próbowałem przez jakiś czas bez powodzenia. Mam katalog, z wieloma katalogami, każdy ma własną strukturę i pliki.Znajdź pliki, zmień nazwę w miejscu bx unix

Szukam znaleźć wszystkie pliki .java w dowolnym katalogu w katalogu roboczym i zmienić ich nazwę na konkretną nazwę. Na przykład, chciałbym nazwać wszystkie pliki java "test.java".

Jeśli struktura katalogu jest:

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

Chcę po prostu zmienić nazwę na:

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

Oczywiście, część z moim problemem jest to, że ścieżki mogą mieć miejsca w I don. nie musisz się martwić o zmianę nazw klas ani nic w pliku, tylko nazwa pliku na miejscu.

Jeśli w katalogu znajduje się więcej niż jeden plik .java, nie mam nic przeciwko temu, że jest on nadpisywany lub wyświetlany jest monit o wybór, co należy zrobić (jest w porządku, jest mało prawdopodobne, że jest więcej niż 1 w każdym katalogu

Co próbowałem:.

Patrząc mv i znaleźć, ale kiedy rura je razem wydaje mi się, że robi to źle, chcę się upewnić, aby utrzymać je w ich bieżącej lokalizacji i zmień nazwę i nie ruszaj się.

Dziękuję, bardzo dziękuję za pomoc

Odpowiedz

21

Wersja GNU o numerze find zawiera akcję -execdir, która zmienia katalog w taki, w którym znajduje się plik.

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

Jeśli wersja find nie obsługuje -execdir następnie można otrzymać pracę z:

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

Jak powinienem odczytać bit '' $ {1%/*} "/ test.java'? – dumbledad

+1

Zmienna '$ 1','% 'usuwa najkrótszy pasujący sufiks '/ *' - usuwa nazwę pliku z '$ 1' jak' dirname "$ 1". '/ test.java' jest dołączany do nazwy tego katalogu. –

5

Jeśli komenda (jak moje) find nie obsługuje -execdir, spróbuj wykonać następujące czynności :

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

Będzie to bezpieczniejsze dla nazw plików z cudzysłowem: '-exec bash -c 'mv" $ 1 "$ (dirname" $ ​​1 ")/test.java' - {} \;' –