ディレクトリ内のすべてのファイルのファイル名に複数のスペースを変更したいと思います。だから名前変更スクリプトを作成したいと思います。
私はこの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
私のエラー出力はmv
l2の合計線です。
エラーを見つけるのに役立つ人はいますか?私が何を間違っているのでしょうか?ありがとう
答え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または他のコマンドを含める理由はありません。
答え2
私が見つけた:ここ
awk -v FS=' ' 'NR==FNR{ s[$1]=$0; next } {print "mv "s[$1]" " $0}' l1 l2