我想从文件夹中的几个文件中删除以下字符。到目前为止,我所拥有的是:
str.delete! '!@#$%^&*()
我认为这将起到删除字符的作用。我需要做些什么才能使它在文件夹中的所有文件中运行?
您澄清了您的问题,表示您希望从目录中文件的内容中删除某些字符。我创建了一种直接的方法来遍历目录(以及可选的子目录(并从文件内容中删除指定的字符。我使用String#delete
就像你开始使用的一样。如果要删除更高级的模式,可能需要使用正则表达式将其更改为String#gsub
。
下面的示例将遍历相对于当前工作目录的tmp
目录(以及所有子目录(,并删除找到的文件中出现的所有!
、$
和@
。当然,您也可以通过绝对路径,例如C:/some/dir
。请注意,我不过滤文件,我认为里面都是文本文件。如果您愿意,当然可以添加文件扩展名检查。
def replace_in_files(dir, chars, subdirs=true)
Dir[dir + '/*'].each do |file|
if File.directory?(file) # Traverse inner directories if subdirs == true
replace_in_files(file, chars, subdirs) if subdirs
else # Replace file contents
replaced = File.read(file).delete(chars)
File.write(file, replaced)
end
end
end
replace_in_files('tmp', '!$@')
我认为这可能会奏效,尽管我对Ruby中的Dir类有点不稳定。
Dir.foreach('/path/to/dir') do |file|
file.delete '!@#$%^&*()
end
这里有一个更通用的问题版本:遍历一个目录中的每个文件
希望会有一个更彻底的答案,但也许这会让你到达你需要的地方。
Dir.foreach('filepath') do |f|
next if Dir.exists?(f)
file = File.new("filepath/#{f}",'r+')
text = file.read.delete("'!@#$%^&*()")
file.rewind
file.write(text)
file.close
end
你不能做的原因
file.write(file.read.delete("'!@#$%^&*()"))
file.read将"游标"留在文本末尾。与其重写文件,不如将其附加到文件中,这不是您想要的。
您还可以向File类添加一个方法,将光标移动到文件的开头。
class File
def newRead
data = self.read
self.rewind
data
end
end
Dir.foreach('filepath') do |f|
next if Dir.exists?(f)
file = File.new("filepath/#{f}",'r+')
file.write(file.newRead.delete("'!@#$%^&*()"))
file.close
end