디렉토리에 있는 모든 파일의 파일 이름에 여러 개의 공백을 바꾸고 싶습니다. 그래서 이름 바꾸기 스크립트를 만들고 싶습니다.
나는 이 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
내 오류 출력은 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