4 votos

Busca en la carpeta, copia en la nueva carpeta y cambia los nombres de los archivos!

Así que estoy tratando de buscar de forma recursiva carpeta, y como usted puede imaginar que va a ser la de "Fotos"de la carpeta en MacOS.

Y en el proceso, me gustaría cambiar el nombre de archivo, ¿por qué usted puede pedir? Porque Nextcloud es por alguna razón de cambiar el nombre de la imagen a year-month-day hour-minute-second $(increment number). Así que tengo que ser capaz de definir esta partida incrementar el número.

Esto es lo que tengo hasta ahora:

# Lets say that starting increment number should be I=7398
# name="$(stat -f '%Sm' -t '%y-%m-%d %H-%M-%S' "$file").$(ls "$file"|cut -d . -f2)"
# echo $name
find . -type f -iname '*.jpg' -size +500k -exec sh -c '
    for file in "$@"; do
        folder="/path/to/backup/folder/$(stat -f '%Sm' -t '%Y/%m' "$file")"
        echo mkdir -p "$folder"
        echo cp "$file" "$folder"
    done
' sh {} +

Esto funciona perfecto! Pero me gustaría en el proceso de cambiar el nombre de los archivos de datos EXIF, para ser '%y-%m-%d %H-%M-%S {increment number}'.ext, 18-08-15 18-32-29 3453.JPG o lo que sea. Es esto posible?

Este script de arriba se lee en un JPG, crea el directorio del año, el archivo de imagen se ha creado, creado otra carpeta del mes correspondiente, copia el archivo en que año de la carpeta.

Resultado esperado: también el cambio de nombre '%y-%m-%d %H-%M-%S {increment number}'.ext

3voto

user3439894 Puntos 5883

La siguiente es una prueba de concepto para mostrar cómo me gustaría construir el target_directory y target_filename de la source_filename, basado en la información en su OP y comentarios:

$ ls -1
DSC_0008.JPG
DSC_0034.JPG
DSC_0077.JPG
DSC_0132.JPG
codetest

$ cat codetest
#!/bin/bash

find . -type f -iname '*.jpg' -size +500k -exec sh -c '
i=7398
for f in "$@"; do
    m="$(exiftool -d "%Y-%m-%d %H-%M-%S" -FileModifyDate -s -S "$f")"
    d="/path/to/backup/directory/${m:0:4}/${m:5:+2}"
    echo mkdir -p "$d"
    echo cp "$f" "$d/$m $i.${f##*.}"
    ((i++))
done
' sh {} +

$ ./codetest
mkdir -p /path/to/backup/directory/2018/11
cp ./DSC_0008.JPG /path/to/backup/directory/2018/11/2018-11-26 15-39-09 7398.JPG
mkdir -p /path/to/backup/directory/2018/12
cp ./DSC_0034.JPG /path/to/backup/directory/2018/12/2018-12-26 11-52-30 7399.JPG
mkdir -p /path/to/backup/directory/2019/03
cp ./DSC_0077.JPG /path/to/backup/directory/2019/03/2019-03-02 08-36-07 7400.JPG
mkdir -p /path/to/backup/directory/2019/04
cp ./DSC_0132.JPG /path/to/backup/directory/2019/04/2019-04-03 23-42-36 7401.JPG
$ 

Obviamente, con el echo comando en su lugar, la salida que se muestra no es citado y que no si ese era el verdadero comando ejecutado, mientras que la copia; sin embargo, con la echo comando eliminado, el real ejecutado el comando se ha comillas alrededor de los argumentos y no podría fallar debido a los espacios en los target_filenames.


El uso de stat en lugar de exiftool:

#!/bin/bash

find . -type f -iname '*.jpg' -size +500k -exec sh -c '
i=7398
for f in "$@"; do
    m="$(stat -f "%Sm" -t "%Y-%m-%d %H-%M-%S" "$f")"
    d="/path/to/backup/directory/${m:0:4}/${m:5:+2}"
    echo mkdir -p "$d"
    echo cp "$f" "$d/$m $i.${f##*.}"
    ((i++))
done
' sh {} +

Nota: Ambas trabajado cuando se ejecuta como un script, o, sin el shebang, copiar y pegar en la Terminal. Dicho esto, no estoy seguro de que me había esta en 30K archivos de una vez por todas sin la adición de algún error en el manejo de adecuado para lo que este código va a hacer. Se los dejo a ustedes para decidir cómo, o si desea implementar cualquier error de manipulación en el ejemplo de código se muestra.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X