ID3tag -Скрипт для извлечения метаданных из имени файла

home/* и *являются глобусами оболочки, они сначала расширяются оболочкой (, поэтому здесь вы работаете как вы, а не с привилегиями суперпользователя ), и результирующие слова , затем передаются в качестве аргумента к команде.

Итак, если homeсодержит ., .., .hidden. u1, u2и текущий каталог содержит ., .., .hidden, -i, x, y, аргументы, которые получит mv, будут mv, home/u1, home/u2, -i, x, y.

В некоторых реализациях mv, таких как GNU mv, есть ошибка, заключающаяся в том, что аргументы, начинающиеся с -, по-прежнему распознаются как параметры, даже если они встречаются после не -аргументов параметров, поэтому выше, что -i, будет принято как вариант -iдляmv(sudoпо понятным причинам не имеет этого недостатка ).

yбудет взят mvв качестве целевого каталога, и именно туда файлы исчезнут, если yимеет тип каталог (или символическую ссылку на каталог ).

mvне увидит аргумент *или home/*(, если, конечно, там нет файлов с такими именами ). Однако обратите внимание, что некоторые оболочки, такие как большинство подобных Bourne -, имеют такую ​​неправильную функцию, что если glob не соответствует ни одному файлу, он передается команде как (нерасширенный ).

Таким образом, если текущий каталог содержит только скрытые файлы, то mvполучит *в качестве последнего аргумента. mvне обрабатывает *специально (роль оболочки заключается в понимании глобусов ), поэтому будет обрабатывать его как буквальное имя целевого каталога. Теперь, если нет скрытого файла, отличного от -, этот каталог *также не будет существовать, поэтому mv home/u1 home/u2 *просто сообщит об ошибке о том, что целевой каталог не существует. Однако, если бы в homeбыло только u1, mv home/u1 *заставило бы mvпереименовать home/u1в *в текущем каталоге.

Эта ошибка была введена оболочкой Bourne в 1979 году.В более ранних версиях Unix (и в csh, который не изменил его ), команда отменяется, если ни один из глобусов не совпадает. Затем globs были расширены помощником /etc/glob(, который дал имя globs ). Однако, если хотя бы один глобус соответствовал какому-либо файлу, не соответствующие -глобусы удалялись. Таким образом, в csh/tcsh (илиzsh -o cshnullglob)mv home/* *, где в текущем каталоге нет скрытого файла, отличного от -, станет mv home/u1 home/u2, который переместит u1в u2.

Современные оболочки, такие как zsh,fish(или bash -o failglob), исправили это, отменив команду, если какой-либо из глобусов не совпадает.

0
20.09.2020, 21:54
1 ответ

Исключение lsparse, один вкладыш -.

#!/bin/sh

for file in *; do
    scrap="$(echo $file | sed 's/-[a-zA-Z0-9]*\w//g; s/.opus//g')"
    id3tag --song="${scrap}" "${f}"
done
0
18.03.2021, 23:03

Теги

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