Множество проблем, вызванных слишком большим количеством ошибок уровней symlink

Это тест для - пунктирной линии вариант аргумента, видимо.Это действительно немного странно. Он использует нестандартное расширение bash в попытке извлечь первый и только первый символ из $ 1 . 0 - это индекс символа заголовка, а 1 - длина строки. В тесте [ также может быть:

[ " -${1#?}" = " $1" ]

Ни одно из сравнений не особенно подходит для теста , поскольку оно интерпретирует - ] также пунктирные аргументы - поэтому я использую там ведущий пробел.

Лучший способ сделать это - а обычно это делается - это:

case $1 in -*) mysqld_safe "$@"; esac
2
19.10.2018, 22:19
3 ответа

Существует ряд инструментов, которые могут распечатывать время воспроизведения различных форматов аудиофайлов, например. sox, mediainfoи др. Какой инструмент использовать, зависит от формата ваших аудиофайлов, о котором вы нам не сообщили.

Вы можете обработать этот вывод с помощью grepи т. д. и использовать его в сценарии оболочки внутри цикла в качестве условия удаления файла.

2
27.01.2020, 21:50

Вам нужно собрать сценарий оболочки, как упоминает @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
27.01.2020, 21:50

По какой-то причине мой 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
1
27.01.2020, 21:50

Теги

Похожие вопросы