package.json의 json 값을 사용하여 폴더 이름을 일괄적으로 바꿉니다.

package.json의 json 값을 사용하여 폴더 이름을 일괄적으로 바꿉니다.

이것은 약간 미친 짓이지만 가능한지 알고 싶습니다.

예를 들어 내 폴더에 300개의 폴더가 있고 /var/www모두 같은 이름으로 이름이 변경될 수 있습니다.[Name](Num)kindred (19)

거의 모든 폴더에는 이라는 파일이 있으며, package.json모든 파일에는 name프로젝트 이름이 포함된 키-값 쌍이 있습니다.

{
  "name": "a useful project name",
   ......
  "main": "src/index.js",
}

package.json포함된 폴더의 이름을 파일 내의 "name" 값으로 바꾸고 싶습니다 package.json.

답변1

json 파일을 구문 분석해야 할 때 사용할 수 있는 더 나은 도구 중 하나는 다음과 같습니다.jq. 이렇게 하면 디렉터리의 파일 name에서 필드를 쉽게 추출할 수 있습니다. package.json이름 바꾸기를 수행하는 것은 간단한 쉘 스크립트입니다.

$ cd /var/www
$ for d in */; do  # *1
>    if [ -f "${d}package.json" ]; then  # *2
>        new_name=$(jq -e -M -r .name "${d}package.json")  # *3
>        if [ $? -eq 0 ] && ! [ -e "${new_name}" ]; then  # *4
>            mv "${d}" "${new_name}"  # *5
>        fi
>    fi
> done

몇 가지 참고사항:

*1: */현재 디렉토리 아래의 모든 디렉토리로 확장됩니다. 모든 디렉토리 이름 끝에 하나가 있으므로 /*2와 *3 뒤에는 하나를 추가하지 않습니다.

*2: package.json파일이 있는 디렉토리만 처리됩니다.

*3: jq에서 이름 필드를 추출 하려면 호출하세요 package.json. with 를 호출 jq하여 -r원시 문자열을 출력하고(즉, 큰따옴표 생략) -M컬러 출력이 없으며 -e필드가 없으면 오류와 함께 종료됩니다.jqname

*4: jq실행이 성공했는지( name필드가 있음) 디렉토리의 새 이름이 아직 존재하지 않는지 확인하십시오. else이름 바꾸기를 건너뛰는 두 경우 모두 오류 메시지를 출력하려면 분리하여 추가해야 할 수도 있습니다.

*5: 디렉토리 이름을 변경합니다.

echo테스트 실행을 위해 명령 앞에 *5를 넣고 mv이름 변경이 올바른지 출력을 확인했습니다. 파일 이 포함된 디렉토리가 많지 않기 때문에 직접 테스트하지 않았습니다 package.json.

관련 정보