我的主目录中有文件
member_net.2017-04-20.control
member_elig_net.2017-04-20.control
mdcr_contractr_net.2017-04-20.control
我想将文件重命名为不同的日期,例如在同一目录中
member_net.2017-04-21.control
member_elig_net.2017-04-21.control
mdcr_contractr_net.2017-04-21.control
这些文件不是 0 字节。
答案1
另一种方法是编写 shell 脚本,例如在 bash 中:
#!/bin/bash
for f in *.2017-04-20.* ;do
mv "$f" "${f/2017-04-20/2017-04-21}"
done
在这种情况下,它比其他解决方案简单得多,但我建议您始终牢记其他解决方案。
答案2
使用 Perlrename
命令:
rename -n -v 's/2017-04-20/2017-04-21/' *.control
(-n
表示不执行任何操作,-v
表示详细信息,因此您可以在实际运行之前检查它的作用。)
答案3
如果这是一次性的,我发现以下过程是便利性和稳健性之间的最佳选择:
使用带有模式的 ls 来选择所需的文件并将输出重定向到文件(该模式只是一个示例,但由于下一步的原因,它并不重要):
ls member_net.*.control > file.list
在您最喜欢的编辑器中进行编辑
file.list
:删除您不想更改的任何文件(这就是为什么上面的模式并不重要);确保它包括全部您想要更改的文件,如有必要,手动添加任何丢失的文件;将每一行从xxx
改为mv xxx XXX
XXX 与 xxx 类似,但带有修改日期。此步骤取决于您的编辑器,但也可以通过使用sed
原始文件并将paste
文件粘贴在一起来完成:sed 's/2017-04-20/2017-04-21/g' file.list > newfile.list
paste file.list newfile.list > bothfiles.list
sed 's/^/mv /' bothfiles.list > commands.list
您现在应该有一个
commands.list
包含以下形式的命令行的文件mv OLDNAME NEWNAME
仔细检查确保每个命令行都是正确和完整的。
然后,您可以通过将文件传输到 shell 来执行命令:
cat commands.list | bash
我觉得有吸引力的是我可以检查文件并确保它完全正确,然后根本不碰它执行其中的所有命令并确保它会做正确的事情。
这不像编写 shell 脚本那么普遍,但它通常是一种值得记住的有用技术。
答案4
这是可以帮助您的 shell 脚本。您可以选择不同的日期。我用的是当前日期。将 shell 脚本保存为 myrename.sh 并调用它./myrename.sh dirname
。其中dirname
是受影响文件的目录名称。
#!/bin/bash
for i in `ls $1 | grep -E '[0-9]{4}-[0-9]{2}-[0-9]{2}'`
do
x=`echo $i | grep -oE '[0-9]{4}-[0-9]{2}-[0-9]{2}'`
y=`echo $i | sed "s/$x/$(date +%F)/g"`
mv $1/$i $1/$y 2>/dev/null #incase if old date is same as current date
done