我有大量文件,其名称格式如下:
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