Problém je zde při analýze pomocí ls
. Zvažte se podívat sem:Proč byste neměli analyzovat výstup ls.
Důvod, proč byste to neměli dělat, je ten, že UNIX povoluje v názvu souboru téměř jakýkoli znak, včetně mezer, nových řádků, čárek, symbolů svislých čar a v podstatě čehokoli, co byste se kdy pokusili použít jako oddělovač kromě NUL. Ve výchozím režimu, pokud standardní výstup není terminál, ls
odděluje názvy souborů novými řádky. To je v pořádku, dokud nemáte soubor s novým řádkem v názvu.
Ach můj bože, to je hrozné.
Váš skript používá bash; Navrhuji, abyste místo toho udělali toto:
#!/bin/bash
for i in *.wav; do mv "${i}" "${i%.wav}.ext"; done
Viz Bash Guide pro více podrobností o rozšíření parametrů.
Můžeš zkusit tohle.
awk '{print substr($0, index($0,$9))}'
Například toto je výstup příkazu ls:
-rw-r--r--. 1 kořenový kořen 73834496 6. prosince 10:55 Soubor s mezerami 2
Pokud používáte jednoduchý awk, jako je tento
# awk '{print $9}'
Vrátí se pouze
# File
Pokud se použije s úplným příkazem
# awk '{print substr($0, index($0,$9))}'
Dostávám celý výstup
Soubor s mezerami 2
Heresubstr(s, a, b) :vrací b počet znaků z řetězce s, počínaje pozicí a. Parametr b je volitelný.
Pokud je například shoda adr:192.168.1.133 a použijete substr následovně
# awk '{print substr($2,6)}'
Získáte IP, tj. 192.168.1.133. Všimněte si, že 6 je znak začínající v adr
Takže ve správném příkazu je $2 $0 (který vytiskne celý řádek.) a index($0,$9) odpovídá $9 a vytiskne vše před sloupcem 9. Můžete to změnit na index($0,$8) a uvidíte, že se výstup změní do
# 10:55 File with spaces 2
`index(IN, FIND)'To vyhledá první výskyt řetězce IN v řetězci IN a vrátí pozici ve znacích, kde tento výskyt začíná v řetězci IN.
Doufám, že to pomůže. Navíc, pokud tuto hodnotu přiřazujete proměnné ve skriptu, musíte proměnné uzavřít do dvojitých uvozovek. V opačném případě se zobrazí chyby, pokud provádíte nějakou jinou operaci s názvem extrahovaného souboru.