재생 시간이 3분 미만인 오디오 파일 찾기 및 삭제

재생 시간이 3분 미만인 오디오 파일 찾기 및 삭제

재생 시간이 3분 미만인 모든 오디오 파일(MP3 파일)을 반복적으로 찾아 삭제하는 방법이 있나요?

디렉터리, 텍스트 파일, mp3 파일 등 다양한 형식의 파일이 혼합되어 있는 상황을 생각해 보세요.

답변1

이것은 한 가지 방법입니다. 각 mp3 파일에 대해 실행하여 mediainfo3분 미만이면 삭제합니다.

#!/bin/bash
for FILE in $(find . -type f -name \*.mp3); do
    [[ $(mediainfo --Output='Audio;%Duration%' "${FILE}") -lt "180000" ]] && rm "${FILE}"
done

또는 재치 있는 말을 좋아하는 사람들을 위해:

find . -type f -name \*.mp3 -exec bash -c '[[ $(mediainfo --Output="Audio;%Duration%" $1) -lt "180000" ]] && rm "$1"' -- {} \;

답변2

그의 답변에 언급된 @dirkt와 같은 쉘 스크립트를 함께 엮어야 합니다.

ffprobeffmpeg그룹을 사용하여 지속 시간을 초 단위로 얻을 수 있습니다.

ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1  /path/to/mp3/file.mp3

find특정 디렉터리 및 모든 하위 디렉터리로 끝나는 모든 파일 찾기를 사용 .mp3하고 발견된 모든 파일의 경로/파일 이름을 제공하는 스크립트를 호출할 수 있습니다.

find /search/from/dir -type f -iname "*.mp3" -exec /path/to/delete_if_short.sh {} \;

delete_if_short.sh스크립트 만들기 - ffprobe명령을 사용하여 길이를 확인하고, 길이가 180 미만이면(값은 초 단위이므로 3분) rm파일을 사용하면 됩니다.

답변3

다양한 오디오 파일 형식의 재생 시간을 인쇄할 수 있는 도구가 많이 있습니다 sox. mediainfo사용할 도구는 오디오 파일 형식에 따라 다르지만 알려주지 않았습니다.

등을 사용하여 이 출력을 처리 하고 grep파일 삭제 여부에 대한 조건으로 루프 내부의 쉘 스크립트에서 사용할 수 있습니다.

답변4

어떤 이유로 내 find-foo가 동등하지 않았기 때문에 찾기 교체를 위해 stackexchange 답변을 해킹하여 이것을 생각해 냈습니다.

#!/bin/bash
# mytime is the number of seconds of the mp3 that you want to delete,
# in this case 3 minutes
mytime=180
files="$(find -L "<put your top level directory here>" -type f -name  "*.mp3")";
# are there any files at all?
if [[ "$files" == "" ]]; then
    echo "No files";
    return 0;
fi
echo "$files" | while read file; do 
    # take the file, find the time, convert to seconds
    times="$(mp3info -p "%m:%s\n" "$file" |awk -F':' '{print ($1*60)+$2}')"
    # if that is greater than 3*60, we delete the file, which is $file.
    if [[ "$times" -lt "mytime" ]]
    then
        # WARNING, there be dragons here... 
        echo "We are removing $file from the system..."
        rm "$file"
    fi 
done

관련 정보