2016-11-04 50 views
-3

我有一个目录“FolderName”,每天有10,000个新文件。几乎这些文件中的一半的命名如下:有没有一种有效的方法来替换空格_文件名? (数千个文件)

filename_yyyy-mm-dd_hh:mm 

而另一半被命名为:

filename_yyyy-mm-dd hh:mm 

(与空间,而不是下划线)

的剧本,我想设置应执行以下操作:

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

我无法找到使脚本高效的方法,我需要真的跳过好的一半,我的脚本试图mv任何文件,它是相当长和低效率。任何更好的设计的好主意?

谢谢大家

+0

你能告诉我们你的脚本,因为它看起来的权利吗? – larsks

+0

如果你有重命名工具,它会很容易。这个网站上有很多答案。 – karakfa

+0

如果您将所有文件重命名为'yyyy-mm-dd_hh:mm_filename'形式,您可以轻松地对旧文件进行排序和移动。或者使用'-k'进行排序并与截止日期进行比较 – dawg

回答

0

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

编辑: 如果函数放在一个脚本,然后找到可以直接使用:

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

+0

谨慎解释downvote? – bschlueter

0

重命名只包含在其名称中有空格的文件,而忽略那些不需要处理文件:

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

移动所有文件早于一个星期了“NewFolderName”文件夹:

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

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

rename -n ' ' _ *\ * 

或者:

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

-n标志是预演,打印什么工作,而无需实际重新命名任何事情发生。如果输出看起来不错,请移除标志并重新运行。

1

与传统rename你可以很容易地转换单一的空间来强调

$ rename ' ' '_' files 
相关问题