![디렉토리 이름을 "fname [mname] lname"에서 "lname, fname [mname]"으로 바꿉니다.](https://linux55.com/image/90047/%EB%94%94%EB%A0%89%ED%86%A0%EB%A6%AC%20%EC%9D%B4%EB%A6%84%EC%9D%84%20%22fname%20%5Bmname%5D%20lname%22%EC%97%90%EC%84%9C%20%22lname%2C%20fname%20%5Bmname%5D%22%EC%9C%BC%EB%A1%9C%20%EB%B0%94%EA%BF%89%EB%8B%88%EB%8B%A4..png)
저자 이름이 "first [mi] last"(중간 이니셜/이름은 여러 개일 수 있음)인 디렉터리가 여러 개 있고 이를 "last, first mi"로 변경하고 싶습니다. 그래서 이름을 여러 토큰으로 구문 분석한 다음 토큰을 다시 정렬하는 방법을 원합니다.
에서는 awk
다음과 같습니다.
ls | awk print '$NF", " $1,$2 ...'
답변1
이는 작동해야 하며 쉘 독립적입니다. 단일 인수(예: 기본 디렉터리)를 사용하여 스크립트로 실행합니다.
find
제공된 기본 디렉토리 바로 아래에 있고 변환된 디렉토리를 제외하고 한 줄에 하나의 디렉토리 이름을 가져오는 데 사용됩니다 .awk
목록에서 기본 디렉터리를 제거하고 각 줄에서 변경하려는 직접 디렉터리의 이름만 남기는 데 사용됩니다 . (awk
여기서는 /를 필드 구분 기호로 사용하고 각 줄의 마지막 필드를 인쇄합니다.)awk
두 번째 인쇄 명령을 사용하여mv
요청한 대로 각 디렉터리의 이름을 바꿉니다. (awk
여기에서는 기본 공백이 필드 구분 기호로 사용됩니다.)출력을 파일에 저장한 다음 적절해 보일 때 실행하십시오.
.
#!/bin/sh
find "$1" -mindepth 1 -maxdepth 1 -type d -not -name "*,*"|\
awk -F/ '{print $NF}'|\
awk -v DIR="$1" '{printf "mv \"" DIR "/" $0 "\" \"" DIR "/" $NF", "; for (i=1; i<NF; i++) {printf $i" "}; printf "\"\n"}'