我有一个目录“FolderName”,每天有10,000个新文件。这些文件中有近一半的命名如下:
filename_yyyy-mm-dd_hh:mm
而另一半被命名为:
filename_yyyy-mm-dd hh:mm
(用空格而不是下划线)
我想设置的脚本应该执行以下操作:
仅重命名名称中包含空格的文件,跳过不需要处理的文件。
我找不到一种方法来使脚本高效,我需要真正跳过好的一半,我的脚本试图mv任何文件,它是相当长和低效的。对于更好的设计有什么好主意吗?
谢谢大家
答案 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/ \;