Le problème ici est l'analyse avec ls
. Pensez à jeter un œil ici :Pourquoi vous ne devriez pas analyser la sortie de ls.
La raison pour laquelle vous ne devriez pas le faire est qu'UNIX autorise presque tous les caractères dans un nom de fichier, y compris les espaces, les sauts de ligne, les virgules, les symboles de pipe et à peu près tout ce que vous essaieriez d'utiliser comme délimiteur, à l'exception de NUL. Dans son mode par défaut, si la sortie standard n'est pas un terminal, ls
sépare les noms de fichiers par des retours à la ligne. C'est très bien jusqu'à ce que vous ayez un fichier avec une nouvelle ligne dans son nom.
Oh mon dieu, c'est horrible.
Votre script utilise bash ; Je vous suggère plutôt de faire ceci :
#!/bin/bash
for i in *.wav; do mv "${i}" "${i%.wav}.ext"; done
Voir le Guide Bash pour plus de détails sur l'expansion des paramètres.
Vous pourriez essayer ceci.
awk '{print substr($0, index($0,$9))}'
Par exemple, voici la sortie de la commande ls :
-rw-r--r--. 1 root root 73834496 6 décembre 10:55 Fichier avec espaces 2
Si vous utilisez un awk simple comme celui-ci
# awk '{print $9}'
Il renvoie uniquement
# File
Si utilisé avec la commande complète
# awk '{print substr($0, index($0,$9))}'
J'obtiens toute la sortie
Fichier avec espaces 2
Heresubstr(s, a, b) :il renvoie b nombre de caractères de la chaîne s, en commençant à la position a. Le paramètre b est facultatif.
Par exemple, si la correspondance est addr :192.168.1.133 et que vous utilisez substr comme suit
# awk '{print substr($2,6)}'
Vous obtenez l'adresse IP, c'est-à-dire 192.168.1.133. Notez que le 6 est le caractère commençant par a dans l'adresse
Donc, dans la commande appropriée, $2 est $0 (qui imprime toute la ligne.) et index($0,$9) correspond à $9 et imprime tout avant la colonne 9. Vous pouvez changer cela en index($0,$8) et voir que la sortie change à
# 10:55 File with spaces 2
`index(IN, FIND)'Cela recherche dans la chaîne IN la première occurrence de la chaîne FIND et renvoie la position en caractères où cette occurrence commence dans la chaîne IN.
J'espère que cela aide. De plus, si vous affectez cette valeur à une variable dans un script, vous devez placer les variables entre guillemets doubles. Sinon, vous obtiendrez des erreurs si vous effectuez une autre opération pour le nom de fichier extrait.