根据新旧文件路径列表移动文件

根据新旧文件路径列表移动文件

对于假定保留在原始文件夹中但格式为以下内容的文件,从文本文件重命名 OSX/BSD 中的文件的有效方法是什么;

/path/old file name.ext\tnew file name.ext

可能有数千个条目使用条目之间的 TAB 分隔符,以及 Windows、OSX 或 Linux 中使用的任何行分隔符。

文件名可以包含任何有效字符,包括 _'!?~*&^%$#@,.∑´®†¥¨ˆ¬˚∆˙©ƒ 和亚洲字体字符

名称以点扩展名结尾,例如.xxx

答案1

更新后的版本:

这一个以规范为准:

  • 每个语句占一行
  • 记录之间以字符分隔\t

这使得事情变得容易得多:

require 'fileutils'
File.open("input.txt", 'r').each_line do |l|
  next if l.strip.empty?
  f = l.split("\t")
  dir = File.dirname f[0]
  if File.exists? f[0]
    p "Moving #{f[0]} to #{dir}/#{f[1].strip}"
    # FileUtils.mv f[0], "#{dir}/#{f[1].strip}"
  else
    p "#{f[0]} does not exist."
  end
end

将其保存为文件并用 调用ruby filename.rb。它将从input.txt同一目录中读取并移动文件。

取消注释# FileUtils…该行以实际移动某些内容。如果找不到原始文件,这将告诉您。


您原来的输入规范是:

  • 每个语句占一行
  • 记录是不是终止或分离,除非其延长
  • 记录可以包含空格,分隔符可以是多个空格(“至少 1 个空格”)

因此,我们必须回退到匹配第一个文件扩展名,然后将其解释为第一个参数。然后,我们需要从原始行中删除此部分,删除开头和结尾的空格,并构造命令mv

附加假设:

  • 所有扩展名只有三个字符,不多不少
  • 文件名本身不包含点(否则会中断)

由于你使用的是 OS X,所以我们就使用 Ruby 吧:

require 'fileutils'
File.open("input.txt", 'r').each_line do |l|
  next if l.strip.empty?
  old_file = l[0, l.index(/\.[a-z0-9]{3}/i) + 4]
  dir = File.dirname old_file
  new_filename = l.sub(old_file, '').lstrip.chomp
  p "Moving #{old_file} to #{dir}/#{new_filename}"
  # FileUtils.mv old_file, "#{dir}/#{new_filename}"
end

相关内容