2017-12-06 1 views
2

Ich versuche, Dateien von meiner Kamera zu verwalten.Mac OS Shell: Finden Sie eine Datei nach exaktem Änderungsdatum

Ich habe 2 Ordner eins für RawFiles und ein anderes für Proxy-Dateien.

Ich möchte alle Dateien im RawFiles-Ordner durchlaufen, das Änderungsdatum abrufen und die übereinstimmende Datei mit demselben Änderungsdatum finden.

Ich habe das folgende Skript so weit (Sie können den Dateipfad ändern müssen)

Ich hätte keine bessere Art und Weise zu „finden“, um eine Datei, die einen genauen Zeitstempel übereinstimmt. Ich habe die Zeile auskommentiert, die die Datei finden soll, die dem Zeitstempel entspricht.

Ich möchte diese auf MacOS Terminal arbeiten zu halten, ohne die Abhängigkeit von Perl usw.

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

nicht sicher, was Ihre Q ist. Wenn Sie Code Review anfordern, sollten Sie den Link "flag" unten in Ihrem Q verwenden und einen Moderator bitten, ihn nach https://codereview.stackexchange.com zu verschieben. Das 'find' sieht vernünftig aus. Wenn Sie damit Fehler bekommen, posten Sie weitere Details, damit die Leute Ihr Problem replizieren können. Viel Glück. – shellter

+0

Was ist * "ProxyCard" * bitte? Was versuchst du eigentlich? Wie kann eine Datei neuer als und auch nicht neuer als etwas sein? Warum glaubst du, dass die Daten dem zweiten entsprechen werden? Was möchtest du eigentlich tun, wenn du ein Spiel findest? Warum druckt "1" ohne ersichtlichen Grund? –

+0

ProxyCard ist nur ein weiterer Ordner. Ich habe grundsätzlich 2 Ordner.Ich habe Dateien in 2 verschiedenen Ordnern mit übereinstimmenden Erstellungsdaten, aber mit unterschiedlichen Dateinamen. Hoffnung, die Sinn macht. Ich versuche ein Skript zu erstellen, das die Dateien im Proxy-Ordner umbenennt, indem das Erstellungsdatum abgeglichen wird. Ich werde versuchen, die Frage zu aktualisieren. –

Antwort

1

nicht sicher, ob ich verstehe, was Sie bis zu sind, aber das sollte helfen. Sie können stat verwenden, um die Änderung (oder Zugriff, Veränderung oder Geburtszeit) in Sekunden seit dem 1. Januar 1970 (Epoche) eine ganzen Reihe von Dateien in einer so gehen zu bekommen:

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

Beispielausgabe

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

Wenn Sie das tun, für beide Verzeichnisse, können Sie dann join verwenden Linien auf dem gemeinsamen Feld zu verbinden (die Zeit):

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

Beispielausgabe

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

Oder können Sie alles in einem Rutsch tun:

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

Wenn Sie möchten, um dann den Zeitstempel-Feld zu entfernen, können Sie tun:

join -o 1.2,2.2 ... 

Sie können die Paare auch in einer Schleife lesen:

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

Darf ich vorschlagen, dass Sie immer sorgfältig prüfen, ob die Anzahl der Dateien korrekt ist - da Sie Probleme haben, wenn Sie zwei Bilder in derselben Sekunde oder kein passendes Bild in derselben Sekunde aufgenommen haben.

Arbeits Script -

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 
+0

Danke! Ist es möglich, eine Datei im ProxyCard-Ordner mit dem Erstellungsdatum = 1511359473 zu finden? Ich muss diese passende ProxyCard-Datei umbenennen. Wenn es eine Möglichkeit gibt, dies zu durchlaufen, bin ich der Reihe von Zeilen beigetreten, ich denke, wir können eine Art String-Analyse durchführen, um die Dateipfade zu erhalten, die ich umbenennen muss. –

+0

Sie können dies tun "stat -f"% m% SN "ProxyCard/* | awk '/ 1511359473/{print $ 2}' ' –

+0

Es ist eine Videokamera und jedes Video wird mindestens 1 Sekunde lang sein. So haben alle Dateien einen anderen Zeitstempel, getrennt durch mindestens eine Sekunde –

Verwandte Themen