Eliminar caracteres especiales y reemplazar el espacio con _ de archivos y directorios de forma recursiva en Bash

1

Tengo un script que me está dando algunos problemas, sé que tengo que volver a hacerlo recursivamente, pero estoy teniendo algunos problemas. La secuencia de comandos debe cambiar el nombre de todos los archivos y carpetas en una carpeta determinada eliminando caracteres especiales como $ -,) (! Y reemplazando "" con "_"

Aquí está la pieza que necesito volver a hacer:

# 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/(.*)_/\./; 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
    
pregunta Erick 16.01.2014 - 21:54

1 respuesta

1

Untested

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 se ve bien, elimine el "eco"

La clave aquí es la opción "-depth" para buscar. Emitirá "./sub dir / file name" antes "./sub dir". De lo contrario, si se cambia el nombre de "./sub dir" a "./subdir", aparecerá un error de "archivo no encontrado" cuando los bucles while pasan a "./sub dir / file name". Además, significa que no necesita una lógica diferente para los directorios.

La opción "-print0" para buscar y la falta de actividad alrededor del comando de lectura son para garantizar que los nombres de los archivos con espacios se manejen correctamente.

    
respondido por el glenn jackman 17.01.2014 - 02:39

Lea otras preguntas en las etiquetas