Come gestire i nomi di file duplicati quando si spostano i file nel terminale?

0

Quindi sto provando a spostare le immagini di una dimensione specifica in un'altra cartella. Ma lavorando con un numero enorme di file, lo stesso nome si presenta una volta ogni tanto. E ho usato questo 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

Ho scoperto che mv ha un comando di backup mv --backup=t ma è solo per linux, quindi non posso usarlo. Ma sarebbe bello avere una sorta di funzione uguale in questo script sopra.

Quindi, come posso aggiungere un numero incrementale se appare lo stesso nome file?

    
posta Adam 11.05.2017 - 15:02
fonte

2 risposte

1

Se sei già un utente homebrew , puoi installare GNU coreutils e accedere rapidamente a GNU mv. Questo è installato come gmv in modo che non infrange nessuno script che si basa sulla sintassi di BSD mv.

Se non usi homebrew e non vuoi installarlo, dovrai fare test con [ -f ${filename} ] ecc. (che mi aspetto sia quello che volevi).

Una volta installato homebrew, esegui,

brew install fileutils

Quindi puoi gmv --backup=t come desiderato.

    
risposta data 11.05.2017 - 16:45
fonte
1

Non è così difficile da fare. È necessario verificare se il file esiste nella directory di destinazione, quindi aggiungere un incremento al nome del file e verificare se tale nome esiste.

Sostituisci mv "$filename" "$targetDir/hehe" nel tuo codice 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

Questo codice farà solo eco alle dichiarazioni mv e non rinominerà alcun file. Si prega di testare accuratamente. Se sei sicuro che l'output ti darà i risultati desiderati, rimuovi l'eco di fronte alle dichiarazioni mv .

    
risposta data 11.05.2017 - 20:59
fonte

Leggi altre domande sui tag