id3v2가 명령줄에서 재귀적으로 사용됩니까?

id3v2가 명령줄에서 재귀적으로 사용됩니까?

id3 태그를 정리하려고 하며 명령줄에서 id3v2를 사용하고 싶습니다. 하지만 *.mp3 와일드카드와 함께만 사용해 왔으며 모든 것을 일괄 처리할 수 있도록 재귀적으로 사용할 수 있는 방법이 있는지 알아보고 싶었습니다. 내 MP3. 재귀적으로 사용할 수 있는 옵션은 없는 것 같습니다.

여러분의 멋진 명령줄 사람들은 모두 이 작업을 수행하는 좋은 방법을 알고 있다고 확신합니다. 하지만 저는 아직 요령을 배우는 중입니다...

무차별 대입을 위해 설정한 alias 명령은 다음과 같습니다.

id3v2 --remove-frame "COMM" *.mp3
id3v2 --remove-frame "PRIV" *.mp3
id3v2 -s *.mp3

그렇다면 음악 폴더의 루트에서 실행할 수 있도록 이 작업을 재귀적으로 수행할 수 있는 방법이 있습니까? 요점은 다른 오디오 파일 형식을 포함하고 위의 세 가지 명령을 모두 하나의 uber 명령으로 축소한다는 것입니다. ( ;그 사이에 있는 명령을 사용하여 이 작업을 수행할 수 있습니다...맞죠?)

답변1

다음과 같이 한 줄로 이 작업을 수행할 수 있습니다.

find . -name '*.mp3' -execdir id3v2 --remove-frame "COMM" '{}' \; -execdir id3v2 --remove-frame "PRIV" '{}' \; -execdir id3v2 -s '{}' \;

{}는 현재 파일 이름 일치를 대체합니다. 따옴표( )로 묶어서 ''쉘로부터 보호합니다. 세미콜론이 나타날 때까지 실행되지만 -execdir세미콜론( ;)을 셸에서 이스케이프해야 하므로 백슬래시( \)가 사용됩니다. 다 거기 있어find 맨페이지:

-exec command ;
      Execute  command;  true  if 0 status is returned.  All following
      arguments to find are taken to be arguments to the command until
      an  argument  consisting of `;' is encountered.  The string `{}'
      is replaced by the current file name being processed  everywhere
      it occurs in the arguments to the command, not just in arguments
      where it is alone, as in some versions of find. 
-execdir command {} +
      Like -exec, but the specified command is run from the  subdirec‐
      tory  containing  the  matched  file,  which is not normally the
      directory in which you started find.  This a  much  more  secure
      method  for invoking commands...

당신은 이것에 대해 조금 새로운 것처럼 들리므로 주목해야 할 사항: 항상 복잡한 셸 명령을 사용하는 경우와 마찬가지로 주의해서 실행하고 무슨 일이 일어날지 확실히 이해하기 위해 먼저 테스트 디렉터리에서 실행해 보십시오. 권리가 있으면 큰 책임도 부여됩니다!

답변2

빠른 해결책은 모든 하위 폴더를 반복하고 그 안에 있는 모든 파일을 처리하는 것입니다.

find . -type d | while IFS= read -r d; do
  id3v2 --remove-frame "COMM" "${d}"/*.mp3
  id3v2 --remove-frame "PRIV" "${d}"/*.mp3
  id3v2 -s "${d}"/*.mp3
done

답변3

나는 그것을 사용하지 않았기 id3v2때문에 확실히 말할 수는 없지만 모든 명령을 하나로 결합할 수 있는 좋은 기회가 있습니다.

id3v2 --remove-frame "COMM" --remove-frame "PRIV" -s *.mp3

하위 디렉터리에 있는 MP3 파일에 대해 이 명령을 실행하려면 다음을 실행하세요.

id3v2 --remove-frame "COMM" --remove-frame "PRIV" -s **/*.mp3

**/*.mp3.mp3현재 디렉터리와 해당 하위 디렉터리의 파일을 반복적으로 일치시킵니다 . 쉘이 zsh인 경우 **/즉시 작동합니다. 쉘이 bash ≥4인 경우 먼저 shopt -s globstar실행해야 합니다(이 줄을 에 입력 ~/.bashrc). ksh에서는 실행해야 합니다 set -o globstar(에 넣습니다 ~/.kshrc). 다른 쉘이 있거나 명령줄이 너무 크다는 메시지와 함께 이 시도가 실패하는 경우 find아래 방법을 사용해야 합니다(다른 답변에 제공된 변형 사용).

디렉토리 및 하위 디렉토리의 파일에 대해 재귀적으로 작업하는 더 복잡하지만 더 유연하고 이식 가능한 방법은 다음 명령입니다 find.

find . -type f -name '*.mp3' -exec id3v2 --remove-frame "COMM" --remove-frame "PRIV" -s {} +

후속 명령이 실행 -exec되면 {} +후행 비트가 일치하는 파일의 경로로 대체됩니다. 여러 명령을 실행해야 하는 경우 id3v2여러 -exec지시어를 사용하세요.

find . -type f -name '*.mp3' -exec id3v2 --remove-frame "COMM" {} + -exec id3v2 --remove-frame "PRIV" {} + -exec id3v2 -s {} +

관련 정보