Bash: сравнение имен с помощью оператора xargs и if - PullRequest
0 голосов
/ 22 ноября 2018

У меня есть папка, если загружены WAV-файлы.Прогресс запускается для преобразования файла.Это должно быть сделано рекурсивно.

Я использую inotifywait, чтобы запустить процесс, если файл добавлен или изменен, Затем я хочу сравнить расширение файла, используя оператор if.

Однако вместо сравнения значения {} он пытается вызвать функцию с заменой имени строки на {}.Вероятно, это проблема моего условия if.

Мой конвейер находится здесь:

inotifywait -mrq -e create -e moved_to --format '%f' ./ | xargs -I {} bash -c "if '{}' =~ *.wav ; then echo {}  ; fi"

Как мне сравнить расширение строки, хранящейся в {}?

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

Если вы хотите фильтровать по определенному расширению, взгляните на https://unix.stackexchange.com/questions/323901/how-to-use-inotifywait-to-watch-a-directory-for-creation-of-files-of-a-specific

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

inotifywait -mrq -e create -e moved_to --format '%f' ./ | while read line; do
    fullname=$(basename -- $line)
    extension=${fullname##*.}
    filename=${fullname%.*}
    echo "fullname=$fullname"
    echo "filename=$filename"
    echo "extension=$extension"
    # now you can do more things with either $filename or $extension
    if [ "$extension" == "wav" ]; then
        echo "to process $fullname"
    fi
done
0 голосов
/ 23 ноября 2018

Две основные проблемы:

  • Вы забыли скобки.if сам по себе может только проверять состояние выхода следующей команды, а somefile =~ *.wav обычно не является командой, но [[ ... =~ ... ]] - это.
  • =~ использует расширенные регулярные выражения, которые немного отличаются от глобусов.Чтобы сопоставить все файлы, оканчивающиеся буквально .wav, необходимо написать .*\.wav$.
inotifywait -mrq -e create -e moved_to --format '%f' ./ |
xargs -I {} bash -c "if [[ '{}' =~ .*\.wav$ ]]; then echo {}; fi"

Однако эта команда может работать только для простых имен файлов без специальных символов.Например, он ломается, если в имени файла есть один '.Было бы безопаснее написать

... | xargs -I {} bash -c 'if [[ "$1" =~ .*\.wav$ ]]; then printf %s\\n "$1"; fi' -- {}

Вы также можете использовать простую и быструю альтернативу

... | grep -E '\.wav$'
...