awk one-liner를 사용하여 이 스크립트를 완료하는 방법은 무엇입니까?

awk one-liner를 사용하여 이 스크립트를 완료하는 방법은 무엇입니까?

디렉토리에 있는 모든 파일의 파일 이름에 여러 개의 공백을 바꾸고 싶습니다. 그래서 이름 바꾸기 스크립트를 만들고 싶습니다.

나는 이 bash 스크립트를 마쳤으며 이것이 awk를 사용하여 한 줄로 수행될 수 있는지 아니면 더 복잡한 방법으로 수행될 수 있는지 묻고 싶었습니다.

#!/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 또는 다른 명령을 포함할 이유가 없습니다.

답변2

내가 찾았어: 여기

    awk -v FS=' ' 'NR==FNR{  s[$1]=$0; next }  {print "mv "s[$1]" " $0}' l1 l2 

관련 정보