使用 Bash 脚本重命名选定的文件

使用 Bash 脚本重命名选定的文件

我有大量文件,其名称格式如下:

Schedule_20210109-235901.jpg

即时间表_日期-时间.jpg

这些文件平均相隔 3 秒,我想编写一个 bash 脚本并选择间隔较大时间的文件并重命名它们。我想我需要一个带有 for 循环和 if 语句的 bash 脚本,但我以前从未真正使用过 bash。

作为上下文,我在过去两年中存储了网络摄像头的图片,并且想要制作延时摄影。然而,以 3 秒为间隔,这基本上是多余的,因为大多数时候我拍摄的工作室里没有发生任何事情。我不想删除不必要的图片或移动大量数据。

我的想法是制作一个 bash 脚本,将“use”添加到文件的开头,例如间隔 30 秒或 1 分钟甚至 1 小时。然后将这些传递给 ffmepg。如果我有时想制作更详细的视频,那么我可以用同样的技巧来挑选它们。

我不知道如何使用正则表达式或通配符来做到这一点。

非常感谢任何积分。

答案1

您可以根据“间隔”逻辑选择任何文件,将它们复制(而不是重命名)到新目录并运行ffmpeg它们。提供ffmpeg参数流比我最初的想法要好-i file,除了 hacky 之外,它还可能有一些限制,例如 shell 命令的长度。

这是一个例子,从第一张开始,每 10 张图片获取一张。它们的顺序是按字母升序排列的,因此是按文件名时间戳排列的:

printf '%s\n' Schedule_* | awk 'NR%10==1' | xargs cp -t temp/ --

或使用 GNU 参数零分隔来概括文件名:

printf '%s\0' Schedule_* | awk 'NR%10==1' RS='\0' ORS='\0' | xargs -r0 cp -t temp/ --

这是选择它们的另一种方法。您可以隔离时间戳,请参阅此示例:

printf '%s\n' Schedule_* | awk '{print substr($0,10,15)}'

返回20210109-235901等。您可以使用它以不同的方式过滤大量文件名。例如,每小时仅获取一张图像(第一张图像,如果这一小时存在任何图像):

printf '%s\n' Schedule_* | awk '!seen[substr($0,10,11)]++'

或者每分钟只获取一张图像:

printf '%s\n' Schedule_* | awk '!seen[substr($0,10,13)]++'

您还可以添加文件选择的开始和结束时间。例如,获取一段时间内每小时的第一张图像:

printf '%s\n' Schedule_* | awk '
  substr($0,10,15)>"202201" && substr($0,10,15)<"20220201-12" && !seen[substr($0,10,13)]++
'

对于所有情况,我们将参数通过管道传递给xargs- cp,以便稍后我们可以ffmpeg使用其 globbing 选项运行到临时目录中。

答案2

我认为用 bash 脚本重命名所有图片我认为根据我的个人经验是行不通的 iv 完成了类似的过程来添加时间戳我认为您也可以在 bash 脚本中使用 AWK 在每个文件旁边添加您自己的时间戳或重命名实用程序

例如

将大写文件重命名为小写。

rename 'y/A-Z/a-z/‘ *

要从一堆文件中删除文件扩展名,请使用以下语法。此示例将删除 .bak 扩展名。

rename 's/\.bak$//' *.bak

这是下面的参考 https://linuxconfig.org/how-to-rename-multiple-files-on-linux

相关内容