2013-02-21 21 views
8

Questo dovrebbe essere relativamente banale ma ho cercato per qualche tempo senza molta fortuna. Ho una directory, con molte directory in, ognuna con la propria struttura e file.Trova file, rinomina in posto unix bash

Sto cercando di trovare tutti i file .java all'interno di qualsiasi directory nella directory di lavoro e li rinominare con un nome particolare. Ad esempio, vorrei nominare tutti i file java "test.java".

Se la struttura di directory è:

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

voglio cambiare titolo semplicemente:

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

Naturalmente, parte del mio problema è che i percorsi possono avere spazi nei I don. Non c'è bisogno di preoccuparsi di ridenominare le classi o qualsiasi cosa all'interno del file, solo il nome del file sul posto.

Se c'è più di 1 file .java in una directory, non mi importa se viene sovrascritto o viene richiesto di scegliere cosa fare (o va bene, è improbabile che ce ne siano più di 1 in ogni directory

Quello che ho cercato:.

Guardando in mv e trovare, ma quando il tubo insieme mi sembra di essere facendo male, voglio fare in modo di mantenere nella loro posizione attuale e rinominare e non spostare

Grazie, ho davvero apprezzato qualsiasi aiuto

risposta

21

La versione GNU di find ha un'azione -execdir che cambia la directory in qualunque sia il file.

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

Se la versione di find non supporta -execdir allora si può ottenere il lavoro fatto con:

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

Come si legge il bit "$ {1%/*}"/test.java'? – dumbledad

+1

La variabile '$ 1','% 'rimuove il suffisso di corrispondenza più breve'/* '- rimuove il nome del file da $ 1' come' dirname "$ 1" 'farebbe. '/ test.java' viene aggiunto al nome di quella directory. –

5

Se il vostro comando find (come il mio) non supporta -execdir, provare le seguenti :

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

Questo sarà più sicuro per i nomi file con le virgolette: '-exec bash -c 'mv" $ 1 "$ (dirname" $ ​​1 ")/test.java' - {} \;' –