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
), исправили это, отменив команду, если какой-либо из глобусов не совпадает.
Исключение ls
parse, один вкладыш -.
#!/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