yurakolotov (
yurakolotov) wrote2012-06-03 06:53 pm
![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Entry tags:
И ещё о Линуксе
Каждый раз, как я наивно предполагаю, что меня уже ничем не удивишь, Линуксу удаётся снова ввести меня в состояние полного охуения.
Ультратривиальная опция, которая присутствовала уже в вонючем дремучем забытом ДОСе 3.0 -- скопировать все файлы из директории А в неё же, изменив окончание (т.е. ручной бэкап) -- отсутствует. Во всяком случае, командой cp этого не сделать.
DOS / Windows:
copy *.m *.qq
Linux:
хрен вам, копируйте в другую директорию
Сотрудник мой, большой любитель командной строки, предложил написать цикл (for f in ...), что ни разу не решает задачу изменения окончаний.
no subject
no subject
Что же в ней нетривиального? :)
Почему раскрыть wildcard в первом аргументе можно, а во втором - нет?
Вернее, в чём трудность увидеть, что второй соответствует первому? (А если не соответствует, то выдать ошибку).
Повторюсь: в ДОСе это делали 20 лет назад.
no subject
А что значит "раскрыть wildcard" во втором случае?
В первом аргументе - очевидно: взять список файлов в текущей директории, у которых заданный extension (например, ".m"). А во втором? Список файлов с extension ".qq" получить невозможно, да и смысла большого нет: если вы еще не делали этого копирования, то файлов с ".qq" еще нету вообще. Вы, очевидно, имеете в виду, что wildcard во втором аргументе надо раскрыть так: взять по одному каждый результат раскрытия первого wildcardа, и заменить у него расширение с ".m" на ".qq". Потом взять по одному представителю из результата раскрытия wildcarda первого аргумента и результата раскрытия wildcarda второго аргумента, составить из них пары, а потом применить операцию копирования к каждой такой паре.
Вот это я и называю "нетривиальная процедура" :)
На самом деле, отличие досовского интерпретатора командной строки от юниксовского в том, что в ДОСе команда получает сам wildcard и должна позаботиться сама о его правильной интерпретации. Досовская команда del, например, каждый wildcard раскроет сама в список соотв. файлов. С другой стороны, copy в MSDos должна "знать", что если у нее два аргумента, и каждый - это wildcard, и эти wilcardы "подобны друг другу", т.е. например, оба состоят из звездочки, точки, и filename extension, то тогда первый wildcard надо раскрыть стандартным способом, т.е. из списка файлов, а второй - не раскрывать вообще, а взять из него новый extension, и проделать со всем этим то, что я перечислил в предыдущем абзаце. Т.е. в команду copy MSDos встроили специальный случай, чтобы делать базовый batch renaming. И я сильно подозреваю, что это было сделано именно потому, что сам интерпретатор командной строки MSDos в части написания скриптов - штука крайне корявая и бессистемная. Тем более, что как и всегда в ДОСе, "шаг влево, шаг вправо - расстрел на месте", т.е. небольшое отклонение от ограничений предусмотренного авторами утилиты случая, и утилита уже не годится. Попробуйте, например, при копировании помимо изменения extension добавить еще и какой-нибудь префикс к имени файла - не фига не выйдет.
В Юниксе (и в Линуксе) wildcards интерпретатор командной строки, и сама команда в качестве аргументов видит имена отдельных файлов. Именно поэтому "cp *.m *.qq" не будет работать так, как в ДОСе: В Юниксе интерпретатор сам раскроет wildcards и cp получит в качестве списка аргументов перечень файлов в текущей директории с этими расширениями (если они есть).
Для пакетной обработки в Юниксе надо либо искать дополнительные утилиты (как например, mrename, которая есть в Ubuntu, не знаю насчет Fedora), либо писать самому простейшие (как правило) скрипты с циклами.
no subject
А "озверение" моё - на уровне мировой скорби.
Гляньте, я там уважаемому Коту Бегемоту написал. Про устаревание понятий.
Можно продолжать выпендриваться и выкручиваться и писать циклы и скрипты, и гордиться тем, что мы можем всё, если только захотим.
А можно делать удобные - и понятные всем - вещи.
Это разница подходов. Принципиальная.
Именно поэтому Линукс был и останется маргинальным, годным только для очень малого процента узких специалистов. (Сумасшедших ненавистников майкрософта я не учитываю).
no subject
"Удобных и понятных всем" утилит на все случаи жизни не создашь. Абсолютно все виндовсовские утилиты с навороченным пользовательским интерфейсом, которые мне попадались (как самой Майкрософт, так и third party), имели "дырки" той или иной величины. Т.е. в каждой из них я сталкивался с отсутсвием поддержки именно мне нужного частного случая, просто не предусмотренного разработчиками. Интернет завален программами разного качества и весом от полутора до 50 мегабайт для решения на Виндоус задач , на которые грамотный пользователь Линукса потратит четыре строчки скрипта. Да и пользователь Виндоус тоже - если владеет средствами написания скриптов.
Не совсем понимаю, что Вы имеете в виду под "выпендриваться и выкручиваться и гордиться тем...".
Я не горжусь тем, что умею писать циклы и скрипты. Я просто умею решать поставленную передо мной задачу быстрым, элегантным и надежным способом. Командная строка - вещь нужная и полезная, и не случайно даже в Майкрософте это поняли - разработали относительно недавно Power Shell.
Насчет "принципиальной разницы подходов" - то это, извините, несерьезно. Уверяю Вас, для среднего пользователя что привычно, то и хорошо. Вот вы привыкли, что copy работает так, как в Windows, и вам кажется это очевидным и естественным. А я двадцать лет проработал на Юниксе, и мне кажется диким, что в Виндах нет нормального фильтра типа grep, и для поиска определенной строки текста в группе файлов надо сделать 35 кликов мышкой. To whom how.
Причина маргинальности Линукса вовсе не в том, о чем вы думаете. А в наличии дикого количества плохо совместимых и не очено хорошо поддерживаемых дистрибутивов. А так - вон Шауль Резник посадил своих родителей на Убунту, и они прекрасно справляются, и не знают, как их обделила жизнь :)
А вообще, скоро Гугль со своим Chrome OS сделает всё это нерелевантным. :)
no subject