Это происходит потому, что имена файлов с подстановочными символами обрабатываются по-разному в Unix и Windows.
В Unix аргументы с подстановочными знаками (аргументы, содержащие *
и ?
) раскрываются оболочкой (обработчик командной строки), а результаты расширения заменяются на подстановочный знак в списке передаваемых аргументов к программе. Если бы вы запустили эту команду rm
в системе Unix, то полученные аргументы rm
были бы списком имен upgrade.8.54.zip
,
upgrade.8.60.zip
и upgrade.8.61.zip
. rm
затем по очереди принимает каждый аргумент и пытается его удалить.
В Windows аргументы с подстановочными символами не раскрываются обработчиком командной строки. Подстановочный знак передается без изменения в качестве аргумента в программу, и программа сама должна найти имена файлов, соответствующие подстановочному знаку.
Поскольку rm
изначально является Unix-программой, написано, что она будет работать с подстановочными знаками. rm
не написано для внутреннего расширения подстановочных знаков. Когда он вызывается в Windows как rm c:\HALS 2000\win7\*.*
и ему передается нерасширенный аргумент c:\HALS 2000\win7\*.*
, он пытается удалить файл, имя которого точно, буквально, c:\HALS 2000\win7\*.*
. Такой файл не существует, поэтому попытка удаления не удалась, и rm
сообщает об ошибке.
del
- команда Windows, поэтому она была написана с расчетом на то, что ее могут попросить обработать расширение подстановочных аргументов. Когда ему дается аргумент c:\HALS 2000\win7\*.*
, он находит файлы, имена которых соответствуют этому шаблону, и удаляет их.