【问题标题】:Mac OS Shell: Find a file by exact modified date timeMac OS Shell:按确切的修改日期时间查找文件
【发布时间】:2018-05-20 20:11:05
【问题描述】:

我正在尝试管理我的相机创建的文件。

我有 2 个文件夹,一个用于 RawFiles,另一个用于代理文件。

我想遍历 RawFiles 文件夹中的所有文件,获取修改日期并找到具有相同修改日期的匹配文件。

目前我有以下脚本(你可能需要更改文件路径)

我找不到更好的方法来“查找”与确切时间戳匹配的文件。我已经注释掉了应该找到与时间戳匹配的文件的行。

我想在不依赖 perl 等的情况下继续在 MacOS 终端上运行。

#!/bin/bash

echo "Start Renaming Proxy files matching RAW files."

fmt='%Y%m%d%H%M%S'

RAWFILES=("/Volumes/RAWCard/"*.CRM)

PROXYDIR="/Volumes/ProxyCard/DCIM"

for f in "${RAWFILES[@]}"
do

 echo  "${f}";

 export STAMP="$(stat -f "%Sm" -t "$fmt" "$f")"

 echo "${STAMP}"

 echo "1"

# find $PROXYDIR -type f -newermt "${STAMP}" ! -newermt "${STAMP}"

 echo "Parse"

 date -j -f %s -v +1S "${STAMP}" +"$fmt"

done```

【问题讨论】:

  • 不确定你的 Q 是什么。如果您要求进行代码审查,您应该使用 Q 底部的 flag 链接并要求版主将其移至 codereview.stackexchange.comfind 看起来很合理。如果您遇到错误,请发布更多详细信息,以便人们可以复制您的问题。祝你好运。
  • 请问什么是"ProxyCard"?你到底想做什么?一个文件怎么可能比某些东西更新,也不比某些东西更新?为什么你认为日期/时间会匹配第二个?当您找到匹配项时,您实际上想做什么?为什么无缘无故打印“1”?
  • ProxyCard 只是另一个文件夹。我基本上有2个文件夹。我在 2 个不同的文件夹中有文件,它们的创建日期匹配但文件名不同。希望这是有道理的。我正在尝试创建一个脚本,通过匹配创建日期来重命名代理文件夹中的文件。我会尝试更新问题。
  • Shellter,“查找”语句不会返回具有匹配创建日期的实际文件。它仅适用于范围,我不确定是否需要在第一个 newermt 中添加 -1 秒,在第二个 newermt 中添加 +1 以获得范围。但是有没有另一种方法来比较日期而不是在一个范围内查找?
  • 我无法编辑问题。所以要清楚,有2个文件夹。原始和代理。 RAW文件夹有文件1.CRM、2.CRM、3.CRM等。PROXY有a.mp4、b.mp4、c.mp4等。1.CRM和a.mp4是同时创建的,2.CRM和同时创建的b.mp4(精确到秒,文件名实际上更复杂)我想遍历RAW文件夹从1.CRM获取创建的时间戳,并在PROXY文件夹中找到与该创建日期匹配的文件以获得本例中为 a.mp4。希望这是有道理的。

标签: macos shell


【解决方案1】:

我不确定我是否理解您在做什么,但这应该会有所帮助。您可以使用stat 一次性获取自 1970 年 1 月 1 日(纪元)以来一大堆文件的修改(或访问、更改或出生时间),如下所示:

stat -f "%m %SN" RAWCard/*

样本输出

1511359473 RAWCard/step1.png
1511359474 RAWCard/step2.png
1512638778 RAWCard/step3.png

如果您对两个目录都这样做,则可以使用join 来连接公共字段(时间)上的行:

stat -f "%m %SN" RAWCard/*    > raw
stat -f "%m %SN" ProxyCard/*  > proxy
join raw proxy

样本输出

1511359473 RAWCard/step1.png ProxyCard/step1.png 
1511359474 RAWCard/step2.png ProxyCard/step2.png
1512638778 RAWCard/step3.png ProxyCard/step3.png

或者,您可以一次完成所有操作:

join <(stat -f "%m %SN" RAWCard/*) <(stat -f "%m %SN" ProxyCard/*)

如果你想删除时间戳字段,你可以这样做:

join -o 1.2,2.2 ...

您还可以循环读取对:

join -o 1.2,2.2 ... | while read a b ; do
   echo $a is friends with $b
done

我建议您始终仔细检查生成的文件数量是否正确 - 因为如果您在同一秒内拍摄了两张图像,或者在同一秒内拍摄了没有匹配的图像,您将遇到问题。

工作脚本 --

echo "Start Renaming Files"

RAWFILES="/Volumes/RAWCard/CRM/REEL_002/*"

PROXYDIR="/Volumes/ProxyCard/DCIM/136_1205/*.MP4"

stat -f "%m %SN" /Volumes/RAWCard/CRM/REEL_002/*.CRM > raw
stat -f "%m %SN" /Volumes/ProxyCard/DCIM/136_1205/*.MP4 > proxy

join raw proxy

join -o 1.2,2.2 raw proxy | while read a b; do
   echo $a is friends with $b
   rawfilebasename=$(basename "$a")
   rawfilename="${rawfilebasename%.*}"
   echo $rawfilename
   proxydirname=$(dirname "$b")
   proxyfilename=$(basename "$b")
   proxyextension="${proxyfilename##*.}"
   echo $proxydirname/$rawfilename.$proxyextension
   mv $b $proxydirname/$rawfilename.$proxyextension

done

【讨论】:

  • 谢谢!是否可以在 ProxyCard 文件夹中找到一个创建日期 = 1511359473 的文件?我需要重命名匹配的 ProxyCard 文件。如果有一种方法可以循环遍历加入的行集,我想我们可以进行某种字符串解析来获取我需要重命名的文件路径。
  • 你可以这样做stat -f "%m %SN" ProxyCard/* | awk '/1511359473/{print $2}'
  • 这是一台摄像机,每个视频至少 1 秒长。所以所有文件都会有一个不同的时间戳,至少间隔一秒
  • 或带变量stat -f "%m %SN" ProxyCard/* | awk -v t= 1511359473 '$1~t{print $2}'
  • 好的,我想我到了某个地方。看到隧道里的光...现在正在编写脚本。
猜你喜欢
  • 2016-04-01
  • 1970-01-01
  • 2012-08-23
  • 1970-01-01
  • 2017-01-02
  • 2021-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多