我在一个目录中有文件。文件名是使用日期时间戳记法构造的,文件名的格式如下:
姓名_YYMM.csv
我想使用以下命名约定重命名所有此类文件:
名称_YYYYMM.csv
我不确定是否可以使用像 grep 这样的命令行实用程序来执行此操作,或者是否需要编写 bash 脚本来执行此操作。
如能得到有关如何解决该问题的任何帮助,我们将不胜感激。
我在 Ubuntu 上运行
答案1
一个非常简单的方法
ls name* | while read a; do mv $a `echo $a | sed s/name_/name_20/`; done
或者
ls name* | while read a; do mv $a $(echo $a | sed s/name_/name_20/); done
(因为反引号的使用不被重视(或者难以阅读))
它会列出所有匹配的文件,name_
然后将找到的每个文件替换name_
为name_20
。如果您正在处理上个千年的文件,则可以将 20 更改为 19。
答案2
rename
您的系统上可能调用了一个程序或 Perl 脚本。
为了Perl 脚本版本:
rename 's/_/_20/' *_*.csv
为了util-linux-ng版本:
rename _ _20 *_*.csv
或者,使用 Bash:
for f in name*; do mv "$f" "${f/_/_20}"; done
答案3
在 zsh 中:
autoload zmv
zmv '(*_[0-9][0-9])([0-9][0-9].csv)' '${1}20${2}'
您可以使模式不太精确,例如'(*_??)(??.csv)'
,即使'(*)(??).csv'
没有其他文件匹配的风险。
如果你不想使用 zsh,请参阅丹尼斯·威廉姆森的回答。