jq를 사용하여 JSON 콘텐츠를 기반으로 파일 이름 바꾸기

jq를 사용하여 JSON 콘텐츠를 기반으로 파일 이름 바꾸기

다음 mp4 파일의 이름을 바꾸려면 jq를 사용하는 쉘 스크립트를 만들어야 합니다. (jasonpipe를 사용할 수 있지만 Mac에 설치하는 방법을 모릅니다)

다운로드된 파일:

  1. 제목 1-1000221327.mp4
  2. title1-1000221327.info.json
  3. 제목 1-1000221328.mp4
  4. title1-1000221328.info.json

위에서 해당 json 파일(2와 3)을 추출하여 파일 1과 3의 이름을 바꾸고 싶습니다.

  • "시리즈": "ShowName", ShowName으로
  • "season_number": 1(예: "S01")
  • "episode_number": 6(예: "E006")
  • "제목": "제목1", 제목1

또한 이 네 가지 변수 사이에 &-""-"" 공백을 삽입하세요.

이름이 바뀐 파일은 다음과 같아야 합니다.

쇼이름 - S01E006 - title1.mp4

"title1-1000221327.info.json"의 내용

편집: 팁을 주셔서 감사합니다: 지금까지 jq 부분을 해결했습니다.

jq '"\(.series) - S0\(.season_number)E00\(.episode_number) - \(.title).mp4"'
{
"description": "Bla Bla Bla",
"episode": "title1",
"episode_number": 6,
"season": "Chapter 1",
"season_number": 1,
"series": "ShowName",
"title": "title1",
"upload_date": "20181006"
}

추신: 내 질문은 다음 질문을 기반으로 합니다. JSON 콘텐츠를 기반으로 파일 이름 바꾸기

답변1

단일 디렉터리(현재 디렉터리)에서 파일을 처리하고 있으며 모든 JSON 파일이 다음과 같다고 가정합니다.옳은형식이나 내용 면에서요. 나는 또한 우리의 쉘이 bash.

시즌 번호(2자리)와 에피소드 번호(3자리)를 수동으로 정수 제로패드로 채우려는 것 같습니다. 형식화를 사용하면 이 작업을 더 정확하게 수행할 수 있지만 형식화된 출력은 지원되지 않으므로 구문 분석을 호출하는 셸 루프를 만듭니다 printf.jqprintfjq쉘 명령newname평가되면 올바른 새 파일 이름으로 쉘 변수가 생성됩니다 .

for name in *.info.json; do
    oldname=${name%.info.json}.mp4

    if [ ! -e "$oldname" ]; then
        printf 'No such file "%s"\n' "$oldname" >&2
        continue
    fi

    unset newname
    eval "$(
        jq -r '[
            "printf", "-v", "newname", "%s - S%.2dE%.3d - %s.mp4",
            .series, .season_number, .episode_number, .title
        ] | @sh' -- "$name"
    )"

    if [ -z "$newname" ] || [ -e "$newname" ]; then
        printf 'Can not rename "%s" to "%s"\n' "$oldname" "$newname" >&2
        continue
    fi

    mv -- "$oldname" "$newname"
done

지정된 JSON 샘플 파일에 대해 jq이 루프의 명령은 문자열을 생성합니다.

'printf' '-v' 'newname' '%s - S%.2dE%.3d - %s.mp4' 'ShowName' 1 6 'title1'

인용은 @sh연산자에 의해 수행되므로 쉘에서 평가를 안전하게 사용할 수 있습니다 eval.

이 셸 명령은 다음 내용을 포함하는 bash변수를 생성합니다.newname

ShowName - S01E006 - title1.mp4

또한 루프는 이름을 바꿔야 하는 파일의 예상 이름을 구성합니다. 이름이 없으면 진단 메시지가 인쇄되고 루프는 다음 이름으로 직접 점프합니다.

실제로 파일 이름을 바꾸기 전에 새 이름에 대해 기본 온전성 검사를 수행하여 실제로 어떤 이름으로 설정되어 있는지, 그리고 새 이름이 이미 다른 파일에서 사용되지 않았는지 확인합니다.

답변2

Linux에서 find 명령을 사용하여 파일 이름을 가져와서 구문 분석하고, 파일을 jq에서 호출된 새 파일 이름으로 옮깁니다.

내일 여러분을 위한 예시를 작성해 보도록 하겠습니다.

(내 영어는 최고가 아니다)

이것이 당신에게 도움이 되기를 바랍니다

대니 프로거

편집: 다음과 함께 사용됨: find(파일 경로) -type f -name "*.mp4" -exec mv {}(파일의 새 경로)(jq 배열의 문자열) \;

관련 정보