选择输出的特定部分并使用它来重命名文件

选择输出的特定部分并使用它来重命名文件

我目前正在整理从损坏的文件系统中恢复的文件。现在它们的文件名都像这样:f123123123.xls

如果我运行:文件“f123123123.xls”,它会给我很多信息,有时甚至是最后保存的日期。

例子:

./recup_dir.89/f111841280.xls:复合文档文件 V2 文档,Little Endian,操作系统:Windows,版本 1.0,代码页:-535,修订号:5,总编辑时间:09:58:37,上次打印:2015 年 9 月 9 日星期三 11:57:04,创建时间/日期:2015 年 9 月 3 日星期四 03:15:36,上次保存时间/日期:2015 年 10 月 19 日星期一 14:28:03

我如何选择最后保存的日期并使用它将我的文件重命名为:Oct-19-2015.xls?

答案1

我们可以将几个命令串在一起来完成此操作。我将使用这个示例将重命名的文件写入另一个目录,您可以将它们移动到任何您想要的位置,但我个人喜欢将它们分开,以防出现一些错误。

mkdir renamed
for recovered in recup_dir.89/*xls; do
    new_name=$(date +'%b-%d-%Y' -d "$(file "$recovered"| grep -Po 'Last Saved Time/Date:\K[^,]*')")
    if [ -n "$new_name" ]; then
        mv "$recovered" "renamed/$new_name.xls"
    fi
done

这将循环遍历目录中的所有 xls 文件(因为这些信息不会出现在所有文件的输出中)。对于每个文件,它将运行命令file并使用 GNU grep 的 perl 样式正则表达式来查找Last Saved Time/Date:出现的位置,然后获取之后的时间。然后我们将使用该date命令按照您的需要重新格式化该时间,这样我们就不必对输出中的各个字段进行太多操作。

这将为我们提供格式的日期Oct-19-2015,然后我们在命令中使用该值mv,正如您所期望的那样,但前提是我们确实得到了日期。如果没有得到任何结果,请不要尝试重命名文件(以防万一之前的命令链并不总是正确运行)。

相关内容