재생 시간이 3분 미만인 모든 오디오 파일(MP3 파일)을 반복적으로 찾아 삭제하는 방법이 있나요?
디렉터리, 텍스트 파일, mp3 파일 등 다양한 형식의 파일이 혼합되어 있는 상황을 생각해 보세요.
답변1
이것은 한 가지 방법입니다. 각 mp3 파일에 대해 실행하여 mediainfo
3분 미만이면 삭제합니다.
#!/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와 같은 쉘 스크립트를 함께 엮어야 합니다.
ffprobe
이 ffmpeg
그룹을 사용하여 지속 시간을 초 단위로 얻을 수 있습니다.
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