Rimuovere caratteri speciali e sostituire lo spazio con _ dai file e dalle directory in modo ricorsivo in Bash

1

Ho uno script che mi sta dando dei problemi, so che devo rifarlo in modo ricorsivo ma sto avendo qualche problema. Lo script dovrebbe rinominare tutti i file e le cartelle in una determinata cartella rimuovendo caratteri speciali come $ -,) (! E sostituendo "" con "_"

Ecco il pezzo che devo rifare:

# 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
    
posta Erick 16.01.2014 - 21:54
fonte

1 risposta

1

testato

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

Se sembra OK, rimuovi "echo"

La chiave qui è l'opzione "-depth" per trovare. Emetterà "./sub dir / nome file" prima di "./sub dir". Altrimenti se "./sub dir" viene rinominato in "./subdir", allora si otterrà un errore "file non trovato" quando il ciclo while arriva a "./sub dir / nome file". Inoltre, significa che non hai bisogno di una logica diversa per le directory.

L'opzione "-print0" per trovare e il busy-ness attorno al comando read servono a garantire che i nomi dei file con spazi siano gestiti correttamente.

    
risposta data 17.01.2014 - 02:39
fonte

Leggi altre domande sui tag