Das Problem hier ist das Parsen mit ls
. Sehen Sie sich hier einmal an:Warum Sie die Ausgabe von ls nicht parsen sollten.
Der Grund, warum Sie dies nicht tun sollten, ist, dass UNIX fast jedes Zeichen in einem Dateinamen zulässt, einschließlich Leerzeichen, Zeilenumbrüche, Kommas, Pipe-Symbole und so ziemlich alles andere, was Sie jemals als Trennzeichen verwenden würden, außer NUL. Im Standardmodus, wenn die Standardausgabe kein Terminal ist, ls
trennt Dateinamen mit Zeilenumbrüchen. Dies ist in Ordnung, bis Sie eine Datei mit einem Zeilenumbruch im Namen haben.
Oh mein Gott, das ist schrecklich.
Ihr Skript verwendet bash; Ich schlage vor, dass Sie stattdessen Folgendes tun:
#!/bin/bash
for i in *.wav; do mv "${i}" "${i%.wav}.ext"; done
Weitere Informationen finden Sie im Bash-Leitfaden für weitere Details zur Parametererweiterung.
Sie könnten dies versuchen.
awk '{print substr($0, index($0,$9))}'
Dies ist beispielsweise die Ausgabe des ls-Befehls:
-rw-r--r--. 1 root root 73834496 6. Dezember 10:55 Datei mit Leerzeichen 2
Wenn Sie einfaches awk wie dieses verwenden
# awk '{print $9}'
Es gibt nur
zurück# File
Bei Verwendung mit dem vollständigen Befehl
# awk '{print substr($0, index($0,$9))}'
Ich erhalte die gesamte Ausgabe
Datei mit Leerzeichen 2
Heresubstr(s, a, b) :Es gibt eine Anzahl von b Zeichen aus der Zeichenfolge s zurück, beginnend bei Position a. Der Parameter b ist optional.
Zum Beispiel, wenn die Übereinstimmung addr:192.168.1.133 ist und Sie substr wie folgt verwenden
# awk '{print substr($2,6)}'
Sie erhalten die IP, dh 192.168.1.133. Beachten Sie, dass die 6 das Zeichen ist, das mit einem in addr beginnt
Im richtigen Befehl ist $2 also $0 (was eine ganze Zeile druckt.) und index($0,$9) stimmt mit $9 überein und druckt alles vor Spalte 9. Sie können das in index($0,$8) ändern und sehen, dass sich die Ausgabe ändert zu
# 10:55 File with spaces 2
`index(IN, FIND)'Dies durchsucht die Zeichenfolge IN nach dem ersten Vorkommen der Zeichenfolge FIND und gibt die Position in Zeichen zurück, an der dieses Vorkommen in der Zeichenfolge IN beginnt.
Ich hoffe, es hilft. Wenn Sie diesen Wert einer Variablen im Skript zuweisen, müssen Sie die Variablen außerdem in doppelte Anführungszeichen setzen. Andernfalls erhalten Sie Fehler, wenn Sie eine andere Operation für den extrahierten Dateinamen ausführen.