2012-05-25 6 views
6

나는 루비를 기반으로하는 파일 이름 바꾸기 프로그램을 스스로 연습하고있다. (나는 리눅스에서 이름을 바꾼다는 것을 알고 있지만 루비를 배우고 싶어한다. Mac에서는 사용할 수 없음).루비 파일의 이름을 변경하는 방법

아래 코드에서 파일 이름이 그러한 검색 패턴을 포함하고 있음에도 불구하고 .include? 메서드는 항상 false를 반환한다는 것이 문제입니다. include? 수표를 주석 처리하면 gsub()은 새 파일 이름을 전혀 생성하지 않는 것처럼 보입니다 (즉 파일 이름은 동일하게 유지됩니다). 그래서 누군가 내가 뭘 잘못했는지 한번보세요. 미리 감사드립니다.

다음은 예상 된 동작입니다 : 현재 폴더에있는 세 개의 파일이 있다고 가정하면 루비 스크립트, b1.jpg하는 B2를 이름을 변경 할 수 있어야한다 a1.jpg, a2.jpg 및 a3.jpg 을. JPG, b3.jpg

#!/Users/Antony/.rvm/rubies/ruby-1.9.3-p194/bin/ruby 

puts "Enter the file search query" 
searchPattern = gets 
puts "Enter the target to replace" 
target = gets 
puts "Enter the new target name" 
newTarget = gets 
Dir.glob("./*").sort.each do |entry| 
    origin = File.basename(entry, File.extname(entry)) 
    if origin.include?(searchPattern) 
    newEntry = origin.gsub(target, newTarget) 
    File.rename(origin, newEntry) 
    puts "Rename from " + origin + " to " + newEntry 
    end 
end 
+0

당신이 세'gets' 프롬프트에 어떤 입력을 제공하고, ... car1, car2로 변환/있었다? – bta

+0

나는 심각하게'rename' 명령이 더 잘할 수 있다고 생각합니다. – texasbruce

+0

@texasbruce, mac에는 이름 바꾸기 명령이 없습니다. 어쩌면 macports 뭔가가 있지만 단지 펄 스크립트의 무리를 발견했다. 하지만 이전에 제안한 것처럼, 그것은 나를위한 루비 운동입니다. – Antony

답변

9

약간 수정 된 버전 :

puts "Enter the file search query" 
searchPattern = gets.strip 
puts "Enter the target to replace" 
target = gets.strip 
puts "Enter the new target name" 
newTarget = gets.strip 
Dir.glob(searchPattern).sort.each do |entry| 
    if File.basename(entry, File.extname(entry)).include?(target) 
    newEntry = entry.gsub(target, newTarget) 
    File.rename(entry, newEntry) 
    puts "Rename from " + entry + " to " + newEntry 
    end 
end 

키 차이 :

  • gets에서 얻은 후행 줄 바꿈을 제거하려면 .strip을 사용하십시오. 그렇지 않으면이 줄 바꿈 문자가 모든 일치 시도를 망칠 것입니다.
  • 모든 것을 globbing하는 대신 glob 호출에서 사용자 제공 검색 패턴을 사용하고 나중에 수동으로 필터링합니다.
  • origin 대신 gsubrename에 대한 호출에서 entry (즉, 전체 파일 이름)을 사용하십시오. origin은 실제로 .include? 테스트에 유용합니다. 파일 이름의 일부이기 때문에 rename과 함께 사용할 수 없습니다. 내가 잘못 사용하려는 유혹을 피하기 위해 origin 변수를 완전히 제거했습니다. 당신이 기대대로 3 개의 입력 프롬프트에 대한 *.jpg, ab를 입력하여 예제 폴더 구조에 대한

은 (각각)에 파일의 이름을 변경해야합니다.

+0

아! 설명 해줘서 고마워. 적어도 문서 (ruby-doc.org)에서, 그것은 스트립 (선행 및 후행 공백 제거) 및 chomp (개행 제거)를 보여 주므로 gets.chomp.strip으로 끝났습니다. 과도하게 과용되지 않습니다. . 어쨌든 스크립트는 완벽하게 작동합니다! – Antony

+0

@ Antony- 뉴 라인은 루비가 "공백"이라고 생각하는 것의 일부이므로'chomp'와'strip'을 모두하는 것은 중복됩니다. 'strip '은'chomp'가하는 모든 일을합니다. – bta

2

귀하의 문제는 gets 문자열의 끝에 개행 문자를 반환합니다. 따라서 "foo"를 입력하면 searchPattern"foo\n"이됩니다. 간단한 수정은 다음과 같습니다

searchPattern = gets.chomp 

나는 약간의 코드를 다시 작성할 수 있습니다

$stdout.sync 
print "Enter the file search query: "; search = gets.chomp 
print "Enter the target to replace: "; target = gets.chomp 
print " Enter the new target name: "; replace = gets.chomp 
Dir['*'].each do |file| 
    # Skip directories 
    next unless File.file?(file) 
    old_name = File.basename(file,'.*') 
    if old_name.include?(search) 
    # Are you sure you want gsub here, and not sub? 
    # Don't use `old_name` here, it doesn't have the extension 
    new_name = File.basename(file).gsub(target,replace) 
    File.rename(file, new_path) 
    puts "Renamed #{file} to #{new_name}" if $DEBUG 
    end 
end 
+0

chomp를 지적 해 주셔서 감사합니다. 매일 새로운 것을 배우기. – Antony

+0

File.rename에 보내는 인수 "new_path"는 어디에 설정되어 있습니까? 아마도 File.rename (file, new_name)을 대신 사용하셨습니까? 그렇지 않으면 +1을 줄 것입니다. – emery

3

나는 받아 들인 대답을 사용하여 복사 된 파일의 이름을 수정했습니다.

Dir.glob('./*').sort.each do |entry| 
    if File.basename(entry).include?(' copy') 
    newEntry = entry.gsub(' copy', '') 
    File.rename(entry, newEntry) 
    end 
end 
0

여기 (패턴 매칭없이) 오늘 사용했습니다 짧은 버전

저장이 같은 rename.rb 파일의 루비 이름을 변경 으로 명령 프롬프트 내에서 실행합니다.RB

count = 1 
newname = "car" 
Dir["/path/to/folder/*"].each do |old| 
    File.rename(old, newname + count.to_s) 
    count += 1 
end 

나는 _MG_2435.JPG의 복사

관련 문제