0 votos

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

Así que estoy tratando de mover las imágenes de una dimensión específica a otra carpeta. Pero trabajar con un gran número de archivos, el mismo nombre de archivo de vez en cuando se presenta. 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

Me enteré de que mv tenía un comando de copia de seguridad mv --backup=t pero eso es sólo para linux, así que no puedo usar eso. Pero sería bueno tener algún tipo de igual función en esta secuencia de comandos anterior.

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

1voto

ratty Puntos 3926

Si usted ya es un homebrew de usuario, se puede instalar GNU coreutils y obtenga acceso rápido a GNU mv. Este se instala como gmv , de modo que no se rompe ninguna secuencia de comandos que se basan en BSD mv de la sintaxis.

Si no hace uso de homebrew y no quieres instalarlo, tendrás que hacer pruebas con [ -f ${filename} ] etc. (que espero que es lo que quería).

Una vez que usted tiene homebrew instalado, ejecutar,

brew install fileutils

A continuación, puede gmv --backup=t como usted desea.

1voto

Michael Zhou Puntos 167

Esto no es que sea difícil de hacer. Usted necesita para comprobar si existe el archivo en el directorio de destino, a continuación, agregue un incremento en el nombre de archivo y la prueba de que si existe el nombre.

Reemplace mv "$filename" "$targetDir/hehe" en el código:

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 sólo se hacen eco de la mv declaraciones y no se cambie el nombre de los archivos. Por favor, prueba a fondo. Si está seguro de que la salida te dará los resultados deseados, a continuación, quitar el eco en frente de la mv declaraciones.

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