Mac OS Shell:按精确修改的日期时间查找文件

时间:2017-12-06 20:23:49

标签: macos shell

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

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

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

到目前为止,我有以下脚本(您可能需要更改文件路径)

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

我想在MacOS终端上保持这种工作,而不依赖于perl等。

#!/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```

1 个答案:

答案 0 :(得分:1)

我不确定你理解你的目标,但这应该有所帮助。您可以使用stat在1970年1月1日(epoch)以来的几秒钟内完成修改(或访问,更改或生成时间),如下所示:

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