Il problema qui è l'analisi con ls
. Considera di dare un'occhiata qui:Perché non dovresti analizzare l'output di ls.
Il motivo per cui non dovresti farlo è poiché UNIX consente quasi tutti i caratteri in un nome file, inclusi spazi bianchi, nuove righe, virgole, simboli pipe e praticamente qualsiasi altra cosa tu abbia mai provato a usare come delimitatore tranne NUL. Nella sua modalità predefinita, se l'output standard non è un terminale, ls
separa i nomi dei file con le nuove righe. Questo va bene finché non hai un file con una nuova riga nel suo nome.
Oh mio Dio, è terribile.
Il tuo script usa bash; Ti suggerisco invece di fare questo:
#!/bin/bash
for i in *.wav; do mv "${i}" "${i%.wav}.ext"; done
Consulta la Guida a Bash per maggiori dettagli sull'espansione dei parametri.
Potresti provare questo.
awk '{print substr($0, index($0,$9))}'
Ad esempio, questo è l'output del comando ls:
-rw-r--r--. 1 root root 73834496 6 dic 10:55 File con spazi 2
Se usi un semplice awk come questo
# awk '{print $9}'
Restituisce solo
# File
Se utilizzato con il comando completo
# awk '{print substr($0, index($0,$9))}'
Ottengo l'intero output
File con spazi 2
Heresubstr(s, a, b) :restituisce b numero di caratteri dalla stringa s, a partire dalla posizione a. Il parametro b è facoltativo.
Ad esempio, se la corrispondenza è addr:192.168.1.133 e utilizzi substr come segue
# awk '{print substr($2,6)}'
Ottieni l'IP, ad esempio 192.168.1.133. Nota che il 6 è il carattere che inizia da a in addr
Quindi nel comando corretto $2 è $0 (che stampa l'intera riga.) e index($0,$9) corrisponde a $9 e stampa tutto prima della colonna 9. Puoi cambiarlo in index($0,$8) e vedere che l'output cambia a
# 10:55 File with spaces 2
`index(IN, FIND)'Cerca nella stringa IN la prima occorrenza della stringa FIND, e restituisce la posizione in caratteri in cui quell'occorrenza inizia nella stringa IN.
Spero possa essere d'aiuto. Inoltre, se si assegna questo valore a una variabile nello script, è necessario racchiudere le variabili tra virgolette. Altrimenti otterrai errori se stai facendo qualche altra operazione per il nome del file estratto.