在shell脚本中将带有日期的文件重命名为不同的日期

在shell脚本中将带有日期的文件重命名为不同的日期

我的主目录中有文件

 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 XXXXXX 与 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

相关内容