我想从文件夹中的多个文件中删除以下字符。到目前为止我所拥有的是:
str.delete! '!@#$%^&*()
我认为这将删除字符。如何让它运行文件夹中的所有文件?
答案 0 :(得分:0)
我认为这可能有用,虽然我对Ruby中的Dir类有些不稳定。
Dir.foreach('/path/to/dir') do |file|
file.delete '!@#$%^&*()
end
这里有一个更通用的问题版本:Iterate through every file in one directory
希望能得到一个更彻底的答案,但也许这会让你找到你需要的地方。
答案 1 :(得分:0)
您澄清了您的问题,说明您要从目录中文件的内容中删除某些字符。我创建了一种直接的方法来遍历目录(以及可选的子目录)并从文件内容中删除指定的字符。我开始使用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', '!$@')
答案 2 :(得分:0)
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