Это тест для -
пунктирной линии вариант аргумента, видимо.Это действительно немного странно. Он использует нестандартное расширение bash
в попытке извлечь первый и только первый символ из $ 1
. 0
- это индекс символа заголовка, а 1
- длина строки. В тесте [
также может быть:
[ " -${1#?}" = " $1" ]
Ни одно из сравнений не особенно подходит для теста
, поскольку оно интерпретирует -
] также пунктирные аргументы - поэтому я использую там ведущий пробел.
Лучший способ сделать это - а обычно это делается - это:
case $1 in -*) mysqld_safe "$@"; esac
Существует ряд инструментов, которые могут распечатывать время воспроизведения различных форматов аудиофайлов, например. sox
, mediainfo
и др. Какой инструмент использовать, зависит от формата ваших аудиофайлов, о котором вы нам не сообщили.
Вы можете обработать этот вывод с помощью grep
и т. д. и использовать его в сценарии оболочки внутри цикла в качестве условия удаления файла.
Вам нужно собрать сценарий оболочки, как упоминает @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
файл и все готово идти.
По какой-то причине мой find -foo не был на должном уровне, поэтому я взломал один ответ stackexchange на замену find и придумал это.
#!/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