awk one-linerを使用してこのスクリプトを完了するには?

awk one-linerを使用してこのスクリプトを完了するには?

ディレクトリ内のすべてのファイルのファイル名に複数のスペースを変更したいと思います。だから名前変更スクリプトを作成したいと思います。

私はこのbashスクリプトを終えて、これをawkを使って1行で実行できるのか、さらに複雑な方法で実行できるのかを尋ねたかったのです。

#!/bin/bash
find $1 -name '*  *.*' -print > l1 
sed -i -e 's/^\|$/"/g'  l1
sed -e 's/  / /g' l1 >  l2 
sed -i -e 's/^/mv /g'   l1
pr -Tm l[12]

awkで試してみましたが、間違った結果が出ました。

#!/bin/bash
find $1 -name '*  *.*' -print > l1 
sed -i -e 's/^\|$/"/g'  l1
sed -e 's/  / /g' l1 >  l2 
awk -v FS=';' 'NR==FNR{  s[$1]=$0; next } END {print "mv "$0" "s[$1];}' l1 l2 

私のエラー出力はmvl2の合計線です。

エラーを見つけるのに役立つ人はいますか?私が何を間違っているのでしょうか?ありがとう

ベストアンサー1

名前のすべてのスペースチェーンを1に圧縮するためにファイル名を変更しますか?つまり、(テストされていません):

#!/usr/bin/env bash

shopt -s extglob
while IFS= read -rd '' old; do
    new="${old// *( )/ }"
    mv -- "$old" "$new"
done < <(find "$1" -name '*  *.*' -print0)

awkまたは他のコマンドを含める理由はありません。

おすすめ記事