有没有一种有效的方法用文件名中的_替换空格? (数千个文件)

时间:2016-11-04 17:24:52

标签: linux bash awk sed

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

filename_yyyy-mm-dd_hh:mm

而另一半被命名为:

filename_yyyy-mm-dd hh:mm

(用空格而不是下划线)

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

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

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

谢谢大家

4 个答案:

答案 0 :(得分:2)

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

rename -n ' ' _ *\ *

或者:

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

-n标志用于干运行,打印在没有实际重命名任何内容的情况下发生的事情。如果输出看起来不错,请删除该标志并重新运行。

答案 1 :(得分:1)

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

$ rename ' ' '_' files

答案 2 :(得分:0)

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循环更快。

答案 3 :(得分:0)

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

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

将所有超过一周的文件移至&#34; NewFolderName&#34;文件夹:

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