【问题标题】:Is there an efficient way to replace spaces with _ in filenames? (thousands of files)有没有一种有效的方法在文件名中用 _ 替换空格? (数千个文件)
【发布时间】:2016-11-04 17:24:52
【问题描述】:

我有一个目录“FolderName”,每天有 10,000 个新文件。这些文件中几乎有一半的名称如下:

filename_yyyy-mm-dd_hh:mm

而另一半被命名:

filename_yyyy-mm-dd hh:mm

(用空格代替下划线)

我要设置的脚本应该执行以下操作:

仅重命名名称中包含空格的文件,跳过不需要处理的文件。

我找不到使脚本高效的方法,我真的需要跳过好的一半,我的脚本试图 mv 任何文件,而且它很长而且效率很低。对于更好的设计有什么好主意吗?

谢谢大家

【问题讨论】:

  • 您能向我们展示您的脚本现在的样子吗?
  • 如果你有重命名工具,那就很简单了。这个网站上已经有很多答案了。
  • 如果您将所有文件重命名为yyyy-mm-dd_hh:mm_filename 的形式,您可以轻松地对旧文件进行排序和移动。或者只是使用-k 排序并与截止日期进行比较
  • 这是两个完全不同的问题。我强烈建议您选择 1 并按照How to Ask 的说明进行操作。也许专注于第一个问题,因为到目前为止所有的答案和 cmets 都是关于那个而不是你的第二个问题。
  • 感谢 Ed 您的地址。是否允许编辑问题是否出现答案?还是保持原样更好?谢谢

标签: linux bash awk sed


【解决方案1】:

查看rename 实用程序,这是专为此设计的 Perl 脚本,它功能强大且速度快。

rename -n ' ' _ *\ *

或者:

find /path/to/dir -type f -name '* *' -exec rename -n ' ' _ {} \;

-n 标志用于试运行,用于打印发生的工作而无需实际重命名任何内容。如果输出看起来不错,请删除标志并重新运行。

【讨论】:

    【解决方案2】:

    使用旧版rename,您可以轻松地将单个空格转换为下划线

    $ rename ' ' '_' files
    

    【讨论】:

      【解决方案3】:

      for f in "$(find . -name '* *')"; do mv $f $(echo $f | sed 's/\ /_/'); done 会做到的。应该有更好的方法使用 find 的 -exec 选项。

      编辑: 如果函数放在脚本中,那么可以直接使用find:

      cat <<EOF > space_to_underscore
      #!/usr/bin/env bash
      mv "$1" "$(sed 's/\ /_/' <(echo "$1"))"
      EOF
      chmod +x space_to_underscore
      
      find . -name '* *' -exec ./space_to_underscore {} \;
      

      这将比使用 for 循环更快。

      【讨论】:

        【解决方案4】:

        仅重命名名称中包含空格的文件,跳过不需要处理的文件:

        for file in *\ * ; do mv "$file" "${file// /_}" ; done
        

        将所有超过一周的文件移动到“NewFolderName”文件夹:

        find -mtime 7 -exec mv {} NewFolderName/ \;
        

        【讨论】:

          猜你喜欢
          • 2021-08-30
          • 2011-07-20
          • 2014-01-18
          • 1970-01-01
          • 2010-09-19
          • 2021-09-11
          • 1970-01-01
          • 1970-01-01
          • 2013-02-11
          相关资源
          最近更新 更多