¿Cómo lidiar con nombres de archivos duplicados al mover archivos en el terminal?

0

Así que estoy tratando de mover imágenes de una dimensión específica a otra carpeta. Pero trabajando con una gran cantidad de archivos, el mismo nombre de archivo se presenta de vez en cuando. Y he estado usando este script:

#!/bin/bash
targetDir="$HOME/Documents/pixx"

find "$targetDir" -iname '*.jpg' -o -iname '*.png' -o -iname '*.bmp' -o -iname '*.jpeg' 2>/dev/null | \
while read -r filename; do
    hw="$(sips -g pixelHeight -g pixelWidth "$filename" 2>/dev/null)"
    h="$(awk '/pixelHeight/{print $2}'<<<"$hw")"
    w="$(awk '/pixelWidth/{print $2}'<<<"$hw")"
    if [[ $h -eq 270 ]] && [[ $w -eq 360 ]]; then
        mv "$filename" "$targetDir/hehe"
    fi
done

Descubrí que mv tenía un comando de copia de seguridad mv --backup=t pero eso es solo para Linux, así que no puedo usarlo. Pero sería genial tener algún tipo de función igual en este script anterior.

Entonces, ¿cómo puedo agregar un número incremental si aparece el mismo nombre de archivo?

    
pregunta Adam 11.05.2017 - 15:02

2 respuestas

1

Si ya eres usuario de homebrew , puedes instalar GNU coreutils y obtenga un acceso rápido a GNU mv. Esto se instala como gmv para que no rompa ningún script que se base en la sintaxis de BSD mv.

Si no usa Homebrew y no quiere instalarlo, deberá realizar pruebas con [ -f ${filename} ] etc. (lo que espero sea lo que quería).

Una vez que tengas Homebrew instalado, ejecuta,

brew install fileutils

Luego puedes gmv --backup=t como quisieras.

    
respondido por el Nic Doye 11.05.2017 - 16:45
1

Esto no es tan difícil de hacer. Debe probar si el archivo existe en el directorio de destino, luego agregar un incremento al nombre del archivo y probar si ese nombre existe.

Reemplaza mv "$filename" "$targetDir/hehe" en tu código con:

base=$filename##*/}     # same as using basename but
                        # with parameter expansion

if [ -e "${targetDir}/hehe/${base}" ]
then
    echo "File exists; $base needs to be renamed.."
    i=1                 # initialize the counter
    shortname=${base%.*} # file name without extension
    ext=${base##*.}     # the file extension

    while [ -e "${targetDir}/hehe/${shortname}_{$i}.${ext}" ]
    do
        ((i++))
    done

    echo mv -- "$filename" "${targetDir}/hehe/${shortname}_{$i}.${ext}"

else
    echo "$base does not need renaming..."
    echo mv -- "$filename" "$targetDir/hehe" 
fi

Este código solo reproducirá las declaraciones mv y no cambiará el nombre de ningún archivo. Por favor, prueba a fondo. Si está seguro de que la salida le dará los resultados deseados, elimine el eco delante de las declaraciones mv .

    
respondido por el fd0 11.05.2017 - 20:59

Lea otras preguntas en las etiquetas