Kopieren Sie eine Datei, die ein Datum im Dateinamen enthält, in einen Ordner für dieses Datum.

Kopieren Sie eine Datei, die ein Datum im Dateinamen enthält, in einen Ordner für dieses Datum.

Ich bin ein Neuling bei Stack Overflow.

Ich brauche Ihre Hilfe. Vielen Dank im Voraus für Ihre Antwort.

Ich habe nach ähnlichen Fragen gesucht, aber es war schwierig, in meinem Fall eine klare Antwort zu finden.

Ich verwende meine Synology DS1515+ und DSM 6.2.2.

Zuerst habe ich mit dem folgenden Skript einen Tagesordner mit einem Datum erstellt:

mkdir /volume1/video/$(date +%Y-%m-%d\(%a\))

Dieses Skript wird jeden Tag um Mitternacht ausgeführt.

Und einige Videodateien werden heruntergeladen. Diese Dateinamen enthalten Datum

Zum Beispiel ABCDABCD.200328.avi oder EFGHIJKH.200327.1080p.mp4

Für Dateinamen gelten keine bestimmten Regeln, aber in jedem Dateinamen vom Typ JJMMTT ist das Datum enthalten.

Ich möchte diese Dateien in Ordner kopieren, die dasselbe Datum enthalten.

(Ordner, der automatisch erstellt wird, wie oben erklärt)

Können Sie helfen oder erklären, wie das geht?

Nochmals vielen Dank. Ich wünsche Ihnen einen schönen Tag.

Antwort1

Wenn ich Sie richtig verstehe, können Sie dies mit GNU grepversuchen date:

shopt -s nullglob
for file in *.avi *.mp4; do 
  dat=$(echo "$file" | grep -Po "(?<=\.)[0-9]{6}(?=\.)")
  if [[ $(date "+%y%m%d" -d "$dat") ]]; then
    dir=$(date -d "$dat" "+%Y-%m-%d(%a)")
    cp "$file" "$dir"
  fi
done

Antwort2

Eine Möglichkeit wäre, GNU Awk ( gawk) zu verwenden, das integrierte Zeitmanipulationsfunktionen hat. Beispiel: (vorausgesetzt, wenn Sie haben gawk, haben Sie auch GNU-Implementierungen von cpund mv)

printf '%s\n' *.mp4 *.avi | gawk -F. '
  {
    datespec = sprintf("20%02d %02d %02d 00 00 00", substr($2,1,2), substr($2,3,2), substr($2,5,2)); 
    cmd = sprintf("echo cp -t %s/ -- %s", strftime("%Y-%m-%d\\(%a\\)",mktime(datespec)), $0);
    system(cmd)
  }
'
cp -t 2020-03-29(Sun)/ -- EFGHIJKH.200329.1080p.mp4
cp -t 2020-03-28(Sat)/ -- ABCDABCD.200328.avi

Entfernen Sie, echowenn Sie zufrieden sind, dass es das Richtige tut. Ändern Sie cpes in mv, wenn Sie es verschieben und nicht kopieren möchten.

Eine weitere Möglichkeit im Falle einer Verschiebung könnte die (Miss-)Verwendung des Perl-basierten renameDienstprogramms sein:

$ rename -n -e 'BEGIN{use Time::Piece}' -e 's@^[^.]*[.]([0-9]{6})[.].*$@Time::Piece->strptime($1,"%y%m%d")->strftime("%Y-%m-%d(%a)/") . $_@e' *.mp4 *.avi
rename(EFGHIJKH.200329.1080p.mp4, 2020-03-29(Sun)/EFGHIJKH.200329.1080p.mp4)
rename(ABCDABCD.200328.avi, 2020-03-28(Sat)/ABCDABCD.200328.avi)

Hier -nnach dem Testen entfernen.

Antwort3

Wenn Sie cdsich in dem Ordner befinden, in dem die Videodateien gespeichert sind, sollten Sie die Dateien mit dem folgenden Befehl verschieben können:

mv -v *YYMMDD* /path-to-new-folder

Dabei wird ein Mustervergleich verwendet, um nur die Dateien zu verschieben, die dieses Datumsformat im Dateinamen haben. Normalerweise verwende ich diese -vOption, sodass der Befehl ausführlich ausgegeben wird, sodass Sie wissen, dass etwas passiert ist.

verwandte Informationen