2013-06-05 2 views
13

여러 파일의 이름을 바꾸려고합니다.파일 이름을 재귀 적으로 바꾸십시오. Mac OSX

ls . | awk '{print("mv "$1" "$1)}' | sed 's/foo/bar/2' | /bin/sh 

내가이 재귀하게 추가 할 수 있습니다

나는 함께 현재 디렉토리에 바 foo는의 인스턴스의 이름을 바꿀 수 있습니까?

편집/내 솔루션 나도 몰라

는 /이 쉘 타입의 물건을 이해 그래서 나는 약간 (아주 더러운) 루비로했다 :

5.times do 
    Dir["**/*"].each do |f| 
    file_name = File.absolute_path f 
    should_rename = file_name.include? "yolo" 
    new_file_name = file_name.gsub("yolo", "#{@project_name}") 
    File.rename(f, new_file_name) if (should_rename and File.exists? f) 
    end 
end 

답변

0

수행하는 방법 "에 대한 답변 나는 X를 일부 파일 구조에서 재귀 적으로 수행한다 "는 거의 항상 항상 find을 사용합니다. 이 경우에는 for 루프와 함께 사용할 수도 있습니다. 다음 예는 현재 디렉토리의 foo 패턴과 일치하는 파일을 반복적으로 반복합니다.

thedir=./ 
for file in $(find $dir -type f -name foo); do 
    # rename $file here 
done 

원하는 이름 변경 방식에 따라하고 이름 바꾸기를 표현하고자하는 방법, 루프의 몸은 서로 다른 이름 변경 명령 ​​(들)을해야합니다.

foo이라는 파일의 이름을 모두 bar으로 변경하면 파일명이 bar이되며 일반적으로 원하는 파일이 아닙니다. $file 변수에는 파일의 상대 경로가 포함되어 있으므로 bar의 경로마다 경로가 달라집니다.

38

이이 요청되었습니다 Recursive batch rename 귀하의 예제와

, 당신이 갈 수 :

brew install rename 
find . -exec rename 's|foo|bar|' {} + 
+4

이름으로 바꿀 파일 세트를 필터링 할 수도 있습니다. 예를 들어 필자는 모든 * .java 파일의 이름을 * .txt로 재귀 적으로 변경해야하므로 이렇게했습니다. 'find. -name "* .java"-exec rename 's \\ .java | \ .txt |' {} +' –

2

rename 유틸리티는 정규식의 지식을 필요로하지 않는 구문을 제공합니다. 이 유틸리티

brew install rename 

옵션 -sbar에 의해 foo의 첫 번째 인스턴스를 대체 설치하면 :

find . -exec rename -s 'foo' 'bar' {} + 

그리고 옵션을 -S 모든 인스턴스를 대체합니다 :

find . -exec rename -S '_' ' ' {} + 

이를 위에서 제공된 Marcel Steinbach과 동일한 솔루션입니다. 구문이 다릅니다.

관련 문제