
Soy novato en desbordamiento de pila.
Necesito tu ayuda. Gracias por su respuesta de antemano.
Busqué preguntas similares, pero en mi caso fue difícil obtener una respuesta clara.
Utilizo mi Synology DS1515+ y DSM 6.2.2.
En primer lugar, me crearon una carpeta diaria que contiene una fecha usando el script como se muestra a continuación;
mkdir /volume1/video/$(date +%Y-%m-%d\(%a\))
Este script se ejecuta todos los días a medianoche.
Y se descargan algunos archivos de video. Esos nombres de archivos contienen fecha.
Por ejemplo, ABCDABCD.200328.avi o EFGHIJKH.200327.1080p.mp4
Los nombres de archivos no tienen ciertas reglas, pero la fecha se incluye en todos los nombres de archivos del tipo AAMMDD.
Me gustaría copiar estos archivos a carpetas que incluyan la misma fecha.
(carpeta lo que se hace automáticamente como arriba explico)
¿Podrías ayudar o explicar cómo hacerlo?
De nuevo, muchas gracias. Que tenga un buen día.
Respuesta1
Si te entiendo correctamente, puedes probar esto con GNU grep
y 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
Respuesta2
Una posibilidad sería utilizar GNU Awk ( gawk
) que tiene funciones integradas de manipulación del tiempo. Por ejemplo (suponiendo que si tiene gawk
, también tiene implementaciones GNU de cp
y 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
Elimínelo echo
una vez que esté satisfecho de que está haciendo lo correcto. Cambie cp
a mv
si desea mover en lugar de copiar.
Otra opción para el caso de movimiento podría ser (ab)usar la rename
utilidad basada en Perl:
$ 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)
Aquí, elimine la -n
prueba posterior.
Respuesta3
Si va cd
a la carpeta donde están almacenados los archivos de video, entonces debería poder mover los archivos usando el siguiente comando:
mv -v *YYMMDD* /path-to-new-folder
Esto utiliza una coincidencia de patrón para mover solo los archivos que tienen ese formato de fecha en el nombre del archivo. Normalmente uso la -v
opción, por lo que el comando se imprime detalladamente, para que sepas que ha hecho algo.