나는 도움이 필요해.
설명이 아닌 이름을 가진 폴더가 많이 있습니다.
각 폴더 안에는 여러 줄로 구성된 "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