폴더 이름을 바꿔야 하는데 새 이름이 각 폴더 내의 txt 파일에 있습니다.

폴더 이름을 바꿔야 하는데 새 이름이 각 폴더 내의 txt 파일에 있습니다.

나는 도움이 필요해.

설명이 아닌 이름을 가진 폴더가 많이 있습니다.

각 폴더 안에는 여러 줄로 구성된 "info.txt" 파일이 있지만 그 중 두 가지에 관심이 있습니다.

artist = Name of the Band
name = Name of the Song

다음 구조로 각 폴더의 이름을 바꾸고 싶습니다.

Name of the Band - Name of the Song

find, grep 및 mv 명령을 조합하면 문제가 해결될 것이라고 생각하지만 올바른 스크립트나 명령을 스스로 생각해낼 만큼 경험이 부족합니다.

미리 감사드립니다!

답변1

이를 수행하는 또 다른 방법입니다(GNU 유틸리티를 가정). 이 테스트가 양호하면 삭제 echo하고 실행하십시오.

#!/bin/sh -
for f in */info.txt; do
    a="$(grep -Pom1 -- "(?<=^artist = ).*" "$f")"
    n="$(grep -Pom1 -- "(?<=^name = ).*" "$f")"
    echo mv -T -- "${f%/*}" "$a - $n"
done

여기도 나쁘지 않아요 -T. 기본 동작은 mv대상이 존재하지 않는 경우 디렉터리 이름을 바꾸고, 존재하는 경우 전체 디렉터리를 대상으로 이동하는 것입니다. 따라서 -T이 기간 동안 기존 대상이 있으면 아무것도 이동되지 않습니다.

나는 모든 디렉토리가 동일한 깊이에 있다고 가정하고 이전 레벨에서 실행해야 합니다.

답변2

info.txt파일을 여러 번 읽을 필요가 없는 또 다른 접근 방식은 다음과 같습니다 .

#!/usr/bin/env bash

## Give a list of target folders in the command line
for dir in "$@"; do
  . <(awk -F'=' '$1=="artist" || $1=="name"{
                      sub(/^ /,"",$2); 
                      print $1"=\""$2"\""
                 }' "$dir/info.txt")
  mv -- "$dir" "$artist - $name"
done

으로 저장하고 foo.sh실행 가능하게 만든 후 다음을 실행하십시오.

foo.sh path/to/dir1 path/to/dir2 ... path/to/dirN

또는 터미널에서 직접 실행하십시오.

for dir in path/to/dir1 path/to/dir2 ... path/to/dirN; do
  . <(awk -F'=' '$1=="artist" || $1=="name"{
                      sub(/^ /,"",$2); 
                      print $1"=\""$2"\""
                 }' "$dir/info.txt")
  mv -- "$dir" "$artist - $name"
done

답변3

내가 올바르게 이해했다면 이것이 효과가 있는지 살펴보겠습니다.

for i in /path/to/your/dirs/*/info.txt; do
  band=$(awk -F'= ' '/^artist/ { print $2 }' "$i")
  
  song=$(awk -F'= ' '/^name/ { print $2 }' "$i")
  
  folder_name="$band - $song"  

  mv "$(dirname "$i")" "$folder_name"
done

관련 정보