
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 grep
versuchen 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 cp
und 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, echo
wenn Sie zufrieden sind, dass es das Richtige tut. Ändern Sie cp
es 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 rename
Dienstprogramms 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 -n
nach dem Testen entfernen.
Antwort3
Wenn Sie cd
sich 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 -v
Option, sodass der Befehl ausführlich ausgegeben wird, sodass Sie wissen, dass etwas passiert ist.