ここでの問題は ls
での解析です .ここを見てみましょう:ls の出力を解析すべきではない理由。
UNIX では、空白、改行、コンマ、パイプ記号など、NUL 以外の区切り文字として使用しようとするほとんどすべての文字をファイル名に使用できるため、これを行うべきではないからです。デフォルトモードでは、標準出力が端末でない場合、 ls
ファイル名を改行で区切ります。名前に改行が含まれるファイルが作成されるまでは、これで問題ありません。
なんてこった、ひどい。
スクリプトは bash を使用します。代わりにこれを行うことをお勧めします:
#!/bin/bash
for i in *.wav; do mv "${i}" "${i%.wav}.ext"; done
Bash ガイドをご覧ください パラメータ展開の詳細については、
これを試すことができます。
awk '{print substr($0, index($0,$9))}'
たとえば、これは ls コマンドの出力です:
-rw-r--r--. 1 root root 73834496 Dec 6 10:55 スペースを含むファイル 2
このような単純な awk を使用する場合
# awk '{print $9}'
のみを返します
# File
完全なコマンドで使用する場合
# awk '{print substr($0, index($0,$9))}'
出力全体を取得します
スペース 2 を含むファイル
Heresubstr(s, a, b) :文字列 s から、位置 a から b 個の文字を返します。パラメータ b はオプションです。
たとえば、一致が addr:192.168.1.133 で、次のように substr を使用する場合
# awk '{print substr($2,6)}'
IP、つまり 192.168.1.133 を取得します。 6 は addr の a から始まる文字であることに注意してください
したがって、適切なコマンドでは、$2 は $0 (行全体を出力します) であり、index($0,$9) は $9 に一致し、列 9 より前のすべてを出力します。これを index($0,$8) に変更すると、出力が変化することがわかります。へ
# 10:55 File with spaces 2
`index(IN, FIND)' これは、stringFIND の最初の出現を文字列 IN で検索し、文字列 IN でその出現が始まる文字位置を返します。
お役に立てば幸いです。さらに、この値をスクリプト内の変数に割り当てる場合は、変数を二重引用符で囲む必要があります。そうしないと、抽出されたファイル名に対して他の操作を行っている場合にエラーが発生します。