1 votos

Eliminar los caracteres especiales y sustituir el espacio por _ de los archivos y directorios de forma recursiva en Bash

Tengo un script que me está dando algunos problemas, sé que tengo que rehacerlo recursivamente pero estoy teniendo algunos problemas. El script debe renombrar todos los archivos y carpetas de una carpeta determinada eliminando los caracteres especiales como $-,)(! y sustituyendo " " por "_"

Aquí está la pieza que necesito rehacer:

# Rename directories
find "$ORIG_DIR" -name "*" -type d| while read dname
do
    NEW_DIR=`echo "$dname" |sed -E 's/^[ \t]*//g; s/[ \t]*$//g; s/\./_/g; s/\,/_/g; s/ /_/g'`

        # Rename files
        find "$ORIG_DIR" -name "*" -type f | while read fname
        do
            NEW_FNAME=`echo "$fname" |sed -E 's/^[ \t]*//g; s/[ \t]*$//g; s/\./_/g; s/(.*)_/\1\./; s/\,/_/g; s/ /_/g'`
            if [ -e $NEW_FNAME ]
            then
                echo "$NEW_FNAME already exists. Not replacing $fname"
            else
                echo "Replacing $fname with $NEW_FNAME"
                mv "$fname" $NEW_FNAME
            fi
        done

    if [ -e $NEW_DIR ]
    then
        echo "$NEW_DIR already exists. Not replacing $dname"
    else
        echo "Replacing $dname with $NEW_DIR"
        mv "$dname" $NEW_DIR
    fi
done

END

1voto

Mark Puntos 6

No probado

find . -depth -print0 |
while IFS= read -d '' -r file; do
    dir=$(dirname "$file")
    base=$(basename "$file") 
    base=${base//[[:space:]]/_}         # change whitespace to underscores
    base=${base//[^[:alnum:]_.]/}       # delete any chars not alphanumeric _ .
    newname="$dir/$base"
    if [[ -e $newname ]]; then
        echo "'$newname' exists, not renaming '$file'"
    else
        echo mv "$file" "$newname"
    fi
done

Si parece que está bien, elimina el "eco"

La clave aquí es la opción "-depth" para encontrar. Emitirá "./sub dir/nombre de archivo" antes de "./sub dir". De lo contrario, si "./subdirectorio" es renombrado a "./subdirectorio", entonces obtendrá un error de 'archivo no encontrado' cuando el bucle while llegue a "./subdirectorio/nombre de archivo". Además, significa que no necesitas una lógica diferente para los directorios.

La opción "-print0" de find y la ocupación del comando read son para asegurar que los nombres de archivos con espacios se manejen correctamente.

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