2013-02-21 7 views
8

Das sollte relativ trivial sein, aber ich habe seit einiger Zeit ohne viel Glück versucht. Ich habe ein Verzeichnis mit vielen Verzeichnissen in, jede mit ihrer eigenen Struktur und Dateien.Dateien finden, an Ort und Stelle umbenennen unix bash

Ich bin auf der Suche nach allen .java-Dateien in einem beliebigen Verzeichnis unter dem Arbeitsverzeichnis, und benennen Sie sie in einen bestimmten Namen. Zum Beispiel möchte ich alle Java-Dateien "test.java" nennen.

Wenn die Verzeichnisstruktur ist:

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

Ich möchte einfach umbenennen:

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

Natürlich Teil meines Problems ist, dass die Wege haben können Räume in I don. Sie müssen sich keine Gedanken darüber machen, Klassen oder etwas in der Datei umzubenennen, sondern nur den Dateinamen.

Wenn mehr als 1 .java Datei in einem Verzeichnis vorhanden ist, hat es nichts dagegen, wenn es überschrieben wird oder eine Eingabeaufforderung gegeben ist (entweder ist ok, es ist unwahrscheinlich, dass es mehr als 1 gibt in jedem Verzeichnis

Was habe ich versucht.

Blick in mv und finden, aber wenn ich Rohr sie zusammen scheine ich es falsch zu tun, ich möchte sicherstellen, dass sie in ihren aktuellen Standort zu halten und Umbenennen und nicht bewegen

Danke, ich schätze wirklich jede mögliche Hilfe

Antwort

21

Die GNU-Version von find verfügt über eine -execdir Aktion, die das Verzeichnis in den Speicherort der Datei ändert.

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

Wenn Ihre Version von find nicht -execdir nicht unterstützt, dann können Sie den Job mit erledigen:

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

Wie soll ich das '" $ {1%/*} "/ test.java' Bit lesen? – dumbledad

+1

Die Variable '$ 1','% 'entfernt das kürzeste passende Suffix'/* '- es entfernt den Dateinamen von' $ 1' wie 'dirname' $ 1" 'würde tun. '/ test.java' wird an diesen Verzeichnisnamen angehängt. –

5

Wenn Ihr find Befehl (wie bei mir) nicht -execdir nicht unterstützt, versuchen Sie die folgende :

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

Dies ist sicherer für Dateinamen mit Anführungszeichen: '-exec bash -c 'mv" $ 1 "$ (dirname" $ ​​1 ")/test.java' - {} \;' –