12

私は自分自身のプログラミング演習として、rubyに基づいたファイル名前変更プログラムを作成しようとしています(Linuxでの名前変更は知っていますが、Rubyを学びたいので、名前変更はMacでは使用できません)。

以下のコードから、.include?ファイル名にそのような検索パターンが含まれていることがわかっても、メソッドが常にfalseを返すという問題があります。include?チェックをコメントアウトするとgsub()、新しいファイル名がまったく生成されないようです(つまり、ファイル名は同じままです)。それで、誰かが私が間違ったことを見てみてください。よろしくお願いします!

予想される動作は次のとおりです。現在のフォルダにa1.jpg、a2.jpg、a3.jpgの3つのファイルがあると仮定すると、Rubyスクリプトは名前をb1.jpg、b2.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
4

6 に答える 6

12

わずかに変更されたバージョン:

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

主な違い:

  • .stripから取得した末尾の改行を削除するために使用しますgets。そうしないと、この改行文字がすべての一致試行を台無しにしてしまいます。
  • すべてをグロブして後で手動でフィルタリングするのではなく、ユーザーが指定した検索パターンをglob呼び出しで使用します。
  • の代わりに、entryの呼び出しで(つまり、完全なファイル名)を使用します。 本当にテストにのみ役立ちます。これはファイル名のフラグメントであるため、。と一緒に使用することはできません。変数を誤用する誘惑を避けるために、変数を完全に削除しました。gsubrenameoriginorigin.include?renameorigin

フォルダー構造の例では*.jpg、、ab入力し、3つの入力プロンプトに(それぞれ)、期待どおりにファイルの名前を変更する必要があります。

于 2012-05-25T17:40:26.440 に答える
4

受け入れられた回答を使用して、コピーされたファイルの名前の束を修正しました。

Dir.glob('./*').sort.each do |entry|
  if File.basename(entry).include?(' copy')
    newEntry = entry.gsub(' copy', '')
    File.rename( entry, newEntry )
  end
end
于 2016-07-18T16:08:39.003 に答える
3

問題は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
于 2012-05-25T17:27:20.600 に答える
1

これが私が今日使った短いバージョンです(パターンマッチングなしで)

これをrename.rbファイルとして保存し、コマンドプロンプト内でrubyrename.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の/Copyをcar1、car2、..に変換しました。

于 2017-01-04T13:37:14.307 に答える
1

DBZシリーズ全体の名前を季節ごとに変更してこれを実装する小さなスクリプトを作成しました。

count = 1
new_name = "Dragon Ball Z S05E"
format_file = ".mkv"
Dir.glob("dragon ball Z*").each do |old_name|
  File.rename(old_name, new_name + count.to_s + format_file)
  count += 1
end

結果は次のようになります。 ドラゴンボールZS05E1ドラゴンボールZS05E2ドラゴンボールZS05E3

于 2019-10-30T03:06:35.783 に答える
0

_フォルダ内で、他のすべてを保持しながら、オーディオファイル名の末尾の下線を削除したかったのです。誰かを助けるかもしれないので、ここで私のコードを共有します。プログラムの機能:

  1. ユーザーに次のプロンプトを表示します。
    • ディレクトリパス:(バックスラッシュではなくスラッシュc:/your/path/hereを使用し、最後のスラッシュは使用しないでください)。/\
    • ファイル拡張子:(mp3ドットなし.
    • 削除する末尾の文字:_
  2. で終わるファイルを探し、ファイルの元の拡張子を保持したままc:/your/path/here/filename_.mp3名前を変更します。c:/your/path/here/filename.mp3

puts 'Enter directory path'

path = gets.strip

directory_path = Dir.glob("#{path}/*")

# Get file extension

puts 'Enter file extension'

file_extension = gets.strip

# Get trailing characters to remove

puts 'Enter trailing characters to remove'

trailing_characters = gets.strip

suffix = "#{trailing_characters}.#{file_extension}"

# Rename file if condition is met

directory_path.each do |file_path|
  next unless file_path.end_with?(suffix)

  File.rename(file_path, "#{file_path.delete_suffix(suffix)}.#{file_extension}")
end
于 2021-11-29T12:53:18.477 に答える