2013-02-21 6 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 

, 내 문제의 부분은 경로에 공백이있을 수 있다는 것입니다 I 돈. 클래스 나 파일 내부의 이름을 바꾸는 것에 대해 걱정할 필요가 없습니다. 파일 이름은 그대로 유지됩니다.

디렉토리에 .java 파일이 두 개 이상있는 경우 덮어 쓰거나 수행 할 작업을 선택하라는 메시지가 표시되면 괜찮습니다 (둘 중 하나만 선택하면됩니다. 각 디렉토리에

내가 시도하는 것 :.

MV로 찾고 찾아,하지만 때 함께 I 파이프 그들을 내가 잘못 일을 할 것, 내가 그들의 현재 위치에 보관해야합니다 싶어 이름 바꾸기 및 이동 안 함

감사합니다. 정말로 도움을 주셔서 감사합니다.

답변

21

find의 GNU 버전은 파일이있는 모든 위치로 디렉토리를 변경하는 -execdir 액션을 가지고 있습니다. (내 같은) 당신의 find 명령 -execdir를 지원하지 않는 경우

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

"$ {1 %/*}"/ test.java' 비트는 어떻게 읽어야합니까? – dumbledad

+1

변수'$ 1','%'은 가장 일치하는 접미사'/ *'를 제거합니다 -'dirname "$ 1"'처럼'$ 1'에서 파일 이름을 제거합니다. '/ test.java'가 그 디렉토리 이름에 추가됩니다. –

5

는, 다음을 시도하십시오 find의 버전이 다음 -execdir를 지원하지 않는 경우

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

당신은 작업으로 끝낼 수 있습니다 :

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

이것은 인용 부호가 붙은 파일명에 대해 더 안전합니다 :'-exec bash -c 'mv "$ 1"$ (dirname "$ 1")/test.java'- {} \;' –

관련 문제