Copie un archivo que contenga la fecha en el nombre del archivo a una carpeta para esa fecha

Copie un archivo que contenga la fecha en el nombre del archivo a una carpeta para esa fecha

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. Entonces, cada medianoche, se hacen estas carpetas.

(Significa que la carpeta de destino siempre existió antes de copiar).

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 como el tipo AAMMDD se incluye en todos los nombres de archivos.

Me gustaría copiar estos archivos a carpetas que incluyan la misma fecha.

(carpeta lo que se hace automáticamente como arriba explico)


[Ubicación del directorio]

Ruta de los archivos que quiero copiar: /volumen1/video/

Ejemplo de directorio de destino: /volume1/video/daily/2020-04-06(Mon)


¿Podrías ayudar o explicar cómo hacerlo?

Si me lo explica, incluya la ruta del directorio en mi caso como se indica arriba.

(porque no puedo aplicar el código que me recomiendas por falta de comprensión. Pido disculpas)

De nuevo, muchas gracias. Que tenga un buen día.

Respuesta1

Prueba esto,

for f in /volume1/video/*; do
  # skip over directories
  [ -f "$f" ] || continue
  # grep the date in YYMMDD format
  date=$(printf '%s' "$f" | grep -Eo '[0-9]{6}')
  # set target path using date to convert YYMMDD to YYYY-MM-DD(%a)
  target="/volume1/video/daily/$(date -d "$date" +%Y-%m-%d\(%a\))/"
  # mv the file
  echo mv "$f" "$target"
done
  • Retire el eco cuando esté funcionando.
  • Quizás sería bueno agregar un cheque para ver si $dateno está vacío.
  • Puede agregar mkdir -p "$target"antes mvpara evitar errores en directorios faltantes.
  • Nota: este código tiene un error millennial ;-)

Respuesta2

Acabo de crear un script que también probé:

#!/bin/bash

SOURCE_FOLDER="video/"
TARGET_FOLDER="video/daily" # Not used as it is under the source folder.

doMove() {
    # Year loop assuming AFTER 2000 up to 2022
    cd "$SOURCE_FOLDER"
    for i in 20{19..20} ; do
        #echo -e "/nWorking on 20$1"
        # Month Loop
        for j in 0{1..9} {10..12} ; do
            # Day Loop
            for k in 0{1..9} {10..31} ; do
                # Find files matching YYMMDD
                file=$(find . -maxdepth 1 -type f -print | grep $i$j$k)
                # For each found file:
                for sf in $file ; do
                    # Find the folder with a different format
                    folder=$(find * -type d -print | grep $i-$j-$k)
                    echo -e "\nFile: $sf"
                    echo -e "Folder: $folder"
                    mv "$sf" "$folder/" # 2> /dev/null
                    echo -e "Moved $sf to $folder"
                done
            done
        done
    done
    cd .. # Change to your needs.
}
doMove

información relacionada