Batch-Kopierzeit Erstellungs- und Änderungsdatum von Dateien mit OSX

Zuallererst habe ich die gleiche Frage beim Stapelüberlauf gestellt, bin mir aber nicht sicher, ob sie dort drüben richtig ist. Deshalb habe ich mich entschieden, es auch hier zu posten.

Es fällt mir schwer, das Erstellungs- und Änderungsdatum einiger Dateien in andere Dateien zu kopieren.
Ich habe einige MXF-Dateien in MOV konvertiert, aber leider haben die neuen MOV-Dateien nicht das gleiche Erstellungsdatum.
Jetzt habe ich mich nach ähnlichen Fragen umgesehen und verschiedene Antworten gefunden, aber das scheint die einfachste zu sein:

    #!/bin/bash
    for f in *.MXF; do
     touch -r "$f" "${f%MXF}mov"
    done


Leider funktioniert es bei mir nicht – weder mit Terminal noch mit Automator.
Ich habe den Code mit TextEdit gespeichert. Im Terminal habe ich chmod+x ausgeführt, um die Datei ausführbar zu machen, und sie in den Ordner gelegt, in dem sich meine MXFs und MOVs befinden.

Aber ich bekomme nur die folgende Fehlermeldung:
touch: *.MXF: No such file or directory
Ich habe auch mxf statt MXF probiert.

Dies ist die Ausgabe von ls-l aus dem Testordner

-rwxrwxrwx  1 username  staff  258458160  5 Jan  2014 570_0301.MXF
-rwxrwxrwx  1 username  staff  241431870  5 Jan  2014 570_0301.mov
-rwxrwxrwx  1 username  staff  974595120  5 Jan  2014 570_0306.MXF
-rwxrwxrwx  1 username  staff  911745994  5 Jan  2014 570_0306.mov
-rwxrwxrwx  1 username  staff  667679280  5 Jan  2014 570_0308.MXF
-rwxrwxrwx  1 username  staff  624468526  5 Jan  2014 570_0308.mov

Da ich es geschafft habe, das Änderungsdatum zu kopieren, scheinen alle Dateien bereits dasselbe Datum zu haben, aber dies deckt nicht das Erstellungsdatum ab.

Vielleicht könnte mir jemand weiterhelfen? Wird es das Änderungs- und Erstellungsdatum ändern? Denn beides ist wichtig...
Vielen Dank im Voraus und alles Gute!


BEARBEITEN: Das Skript funktioniert dank user3439894.
Aber es aktualisiert immer noch nicht das Erstellungsdatum ...
MXF: erstellt am 05.01.2014 06:49, geändert am 05.01.2014 06:50
mov: erstellt am 23.06.2016 05:34, geändert am 05.01.2014 06:50

Gibt es eine Möglichkeit, dies zu korrigieren?

In dieser Frage ist viel zu viel los, und Stack Overflow ist wahrscheinlich ein besserer Ort, um zu fragen. Das heißt, ich würde die Frage so ändern, dass sie nur einen Codeblock darüber enthält, was Sie versuchen zu versuchen, und dann [How to create a Minimal, Complete, and Verifiable example] ( stackoverflow.com/help/mcve ) folgen, um sie einzuschließen diesen Codeblock. Fügen Sie in die Info auch die Ausgabe von ls -lfür das Zielverzeichnis ein. Fortsetzung im nächsten Kommentar...
Außerdem habe ich mit einer Handvoll $filename.MXFund- $filename.movDateien, die $filenamemit jedem Satz von .MXFund- .movDateien übereinstimmten, #1 als getestet for f in *.MXF; do touch -r "$f" "${f%MXF}mov"; doneund es hat gut funktioniert! Also welches Problem hast du damit? Beachten Sie, dass die .MXFDateien nicht sein können .mxf, da hier zwischen Groß- und Kleinschreibung unterschieden wird. Gleiches gilt für .mov, es muss das sein und nicht .MOV. (Deshalb habe ich gesagt, schließe die Ausgabe von ls -l für das Zielverzeichnis ein.)
@user3439894 Vielen Dank für Ihre Informationen. ls -l zeigt -rwxrwxrwx für alle Dateien im Ordner und drwxrwxrwx für den Ordner. Wenn Nr. 1 für Sie (und anscheinend viele andere Leute) gut funktioniert, was mache ich falsch, um "touch: *.MXF: No such file or directory" zu erhalten?
Wenn Sie den Code von #1 ausführen, befinden Sie sich in dem Verzeichnis, das die Dateien .MXFund enthält .mov? Übrigens habe ich nicht gefragt, ob die Berechtigungen für alle Dateien gleich sind! Ich habe nach der Ausgabe von ls -lfür das Zielverzeichnis gefragt, damit ich die Namen der Dateien usw. tatsächlich sehen kann. Außerdem habe ich gesagt, dass Sie in dieser Frage viel zu viel los sind und sie auf einen Codeblock beschränken und Minimal bereitstellen sollen , vollständiges und überprüfbares Beispiel . Sie können unmöglich von uns Hilfe erwarten, wenn wir nicht alle relevanten Fakten haben!
Nochmals vielen Dank für die schnelle Antwort. Ich habe den gesamten Code eingefügt, den ich gefunden habe, um einen Überblick darüber zu geben, was ich versucht habe, und die beste Lösung für das zu finden, was ich tun möchte ... Ich werde wissen, dass ich die ganze Frage bearbeite, nur eine Sekunde ...
Das Erstellungsdatum ist spezifisch für das HFS+-Dateisystem. Wenn Sie versuchen, diese Metadaten auf einem fremden Dateisystem zu ändern, kann Ihr Kilometerstand variieren. Ihr touchBefehl arbeitet nur mit der Zugriffs- und Änderungszeit, die die Änderungszeit ändern sollte, nicht die Erstellungszeit. SetFileist das Werkzeug, das Sie verwenden müssen.
@fd0 Hast du ein Beispiel, wie ich mit SetFile bekomme, was ich will? Danke für die Info.
@fd0, Using GetFileInfo -d $filename.mov, das das Erstellungsdatum erhält, zeigt dasselbe für $filename.movnach dem Ausführen for f in *.MXF; do touch -r "$f" "${f%MXF}mov"; donewie für $filename.MXF. Warum wird also SetFilebenötigt?
@ user3439894 Du hast Recht. Mein Fehler, ich habe nicht getestet touch -r, ich habe das Handbuch gelesen, das falsch ist.
@ user3439894 Vielen Dank für die Klarstellung. Wissen Sie, ob ich beim Erstellen des Skripts etwas falsch gemacht habe? Wie hast du es gefahren?
@phramenma, In Terminal I cdin das Verzeichnis mit den .MXFDateien .movund und dann auf der Befehlszeile genau verwendet:for f in *.MXF; do touch -r "$f" "${f%MXF}mov"; done
@ user3439894 Das scheint zu funktionieren! ABER es aktualisiert immer noch nicht das Erstellungsdatum... MXF: erstellt am 05.01.2014 06:49, geändert am 05.01.2014 06:50 – mov: erstellt am 23.06.05:34, geändert am 05.01.2014 06:50 Gibt es welche Möglichkeit, dies zu korrigieren?
@phramenma, Was ist im Terminal die Ausgabe von:uname -a; bash --version
@user3439894 Hier ist die Ausgabe: Darwin Kernel Version 15.4.0: Fri Feb 26 22:08:05 PST 2016; root:xnu-3248.40.184~3/RELEASE_X86_64 x86_64 GNU bash, Version 3.2.57(1)-release (x86_64-apple-darwin15) Copyright (C) 2007 Free Software Foundation, Inc.

Antworten (2)

Da dies bei Ihnen nicht funktioniert, schlage ich vor, dass Sie wie von fd0 vorgeschlagen vorgehen und SetFile. Dies wird in Verbindung mit verwendet GetFileInfo, die beide Teil der Befehlszeilentools für Xcode sind.

Sie müssen die Xcode.app nicht installieren, die ~3,80 GB groß ist, nur ~160 MB für die Befehlszeilentools für Xcode.

Im Terminal:xcode-select --install

Siehe How to Install Command Line Tools in OS X Mavericks & Yosemite (Without Xcode) , das auch für OS X El Capitan gilt.

Hier ist ein Bash-Skript, das mit SetFileund verwendet werden kann GetFileInfo:

#!/bin/bash

for f in *; do

    if [[ -f $f ]] && [[ ${f##*.} == MXF ]] && [[ -f ${f%.*}.mov ]]; then

        cDate="$(GetFileInfo -d "$f")"
        mDate="$(GetFileInfo -m "$f")"

        SetFile -d "$cDate" -m "$mDate" "${f%.*}.mov"

    fi

done

Geben Sie hier die Bildbeschreibung ein

Ich vermute, dass sich diese Dateien nicht auf einem HFS+-Dateisystem befinden, wie ich bereits sagte, YMMV.
@ fd0, leider hat Phramenma nicht gesagt, wo sich die Dateien befinden oder welches Dateisystem. for f in *.MXF; do touch -r "$f" "${f%MXF}mov"; donefunktioniert gut für mich auf einem HFS + Dateisystem. Beides statund GetFileInfobestätigt, dass es für mich funktioniert, ohne SetFile. Da es nicht funktioniert ist es einfacher für mich eine Lösung anzubieten SetFilewie ich es in der Vergangenheit schon einige Male mit anderen Beiträgen gemacht habe.
@user3439894 Vielen Dank für Ihre großartige Hilfe. Ich schätze es sehr und die Zeit, die Sie für meine Probleme aufwenden. :/ Die Dateien werden auf einer exFat-HDD gespeichert. Aber leider kopiert der Originalcode nur das Änderungsdatum. Ihr neues Skript hat es einfach geschafft! Danke nochmal!!! PS Welche Anwendung hast du im Screenshot verwendet?
@phramenma, gerne geschehen, ich bin froh, dass ich helfen konnte. Ich habe Sublime Text verwendet und verwende es für einige meiner Skriptanforderungen.
@@phramenma, ich habe am Anfang meiner Aussage einen weiteren Test hinzugefügt : , nur zur Sicherheit. Auf diese Weise erhält GetFileInfo, was auch immer sich im Verzeichnis befindet, nur dann, wenn es eine normale Datei ist, die auf endet und eine entsprechende Datei hat, das Erstellungsdatum und die geänderte Datumszeit und wendet sie auf die Zieldatei an. if if [[ -f "$f" ]] && ....MXF.mov

Wenn Sie nur das Änderungsdatum in das Erstellungsdatum derselben Dateien kopieren müssen, können Sie mein modifiziertes Skript verwenden:

#!/bin/bash

for f in *; do


    cDate="$(GetFileInfo -d "$f")"
    mDate="$(GetFileInfo -m "$f")"

    SetFile -d "$mDate" "$f"


done