yurakolotov: (Default)
yurakolotov ([personal profile] yurakolotov) wrote2012-06-03 06:53 pm
Entry tags:

И ещё о Линуксе


Каждый раз, как я наивно предполагаю, что меня уже ничем не удивишь, Линуксу удаётся снова ввести меня в состояние полного охуения.

Ультратривиальная опция, которая присутствовала уже в вонючем дремучем забытом ДОСе 3.0 -- скопировать все файлы из директории А в неё же, изменив окончание (т.е. ручной бэкап) -- отсутствует. Во всяком случае, командой cp этого не сделать.

DOS / Windows:
copy *.m *.qq

Linux:
хрен вам, копируйте в другую директорию

Сотрудник мой, большой любитель командной строки, предложил написать цикл (for f in ...), что ни разу не решает задачу изменения окончаний.


[identity profile] panikowsky.livejournal.com 2012-06-03 04:12 pm (UTC)(link)
Я бы не сказал, что это ультратривиальная опция. Да и задача в общем-то

[identity profile] yurakolotov.livejournal.com 2012-06-03 04:17 pm (UTC)(link)
Мсье Паниковский, Вы меня огорчаете...
Что же в ней нетривиального? :)

Почему раскрыть wildcard в первом аргументе можно, а во втором - нет?

Вернее, в чём трудность увидеть, что второй соответствует первому? (А если не соответствует, то выдать ошибку).

Повторюсь: в ДОСе это делали 20 лет назад.

[identity profile] panikowsky.livejournal.com 2012-06-03 07:50 pm (UTC)(link)
Ну, то что в ДОСе это делали 20 лет назад еще не служит рекомендацией. :)

А что значит "раскрыть 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), либо писать самому простейшие (как правило) скрипты с циклами.

Edited 2012-06-03 19:54 (UTC)

[identity profile] yurakolotov.livejournal.com 2012-06-03 07:55 pm (UTC)(link)
Да я это сам понимаю.
А "озверение" моё - на уровне мировой скорби.
Гляньте, я там уважаемому Коту Бегемоту написал. Про устаревание понятий.

Можно продолжать выпендриваться и выкручиваться и писать циклы и скрипты, и гордиться тем, что мы можем всё, если только захотим.
А можно делать удобные - и понятные всем - вещи.

Это разница подходов. Принципиальная.

Именно поэтому Линукс был и останется маргинальным, годным только для очень малого процента узких специалистов. (Сумасшедших ненавистников майкрософта я не учитываю).

[identity profile] panikowsky.livejournal.com 2012-06-03 10:23 pm (UTC)(link)
Вы смешиваете в кучу разные вещи. На самом деле, мне кажется, тут вопроч в том, должен ли грамотный пользователь владеть командной строкой и скриптами, или во всем положиться на разработчиков операционной системы и дополнительных аппликаций?

"Удобных и понятных всем" утилит на все случаи жизни не создашь. Абсолютно все виндовсовские утилиты с навороченным пользовательским интерфейсом, которые мне попадались (как самой Майкрософт, так и third party), имели "дырки" той или иной величины. Т.е. в каждой из них я сталкивался с отсутсвием поддержки именно мне нужного частного случая, просто не предусмотренного разработчиками. Интернет завален программами разного качества и весом от полутора до 50 мегабайт для решения на Виндоус задач , на которые грамотный пользователь Линукса потратит четыре строчки скрипта. Да и пользователь Виндоус тоже - если владеет средствами написания скриптов.

Не совсем понимаю, что Вы имеете в виду под "выпендриваться и выкручиваться и гордиться тем...".
Я не горжусь тем, что умею писать циклы и скрипты. Я просто умею решать поставленную передо мной задачу быстрым, элегантным и надежным способом. Командная строка - вещь нужная и полезная, и не случайно даже в Майкрософте это поняли - разработали относительно недавно Power Shell.

Насчет "принципиальной разницы подходов" - то это, извините, несерьезно. Уверяю Вас, для среднего пользователя что привычно, то и хорошо. Вот вы привыкли, что copy работает так, как в Windows, и вам кажется это очевидным и естественным. А я двадцать лет проработал на Юниксе, и мне кажется диким, что в Виндах нет нормального фильтра типа grep, и для поиска определенной строки текста в группе файлов надо сделать 35 кликов мышкой. To whom how.

Причина маргинальности Линукса вовсе не в том, о чем вы думаете. А в наличии дикого количества плохо совместимых и не очено хорошо поддерживаемых дистрибутивов. А так - вон Шауль Резник посадил своих родителей на Убунту, и они прекрасно справляются, и не знают, как их обделила жизнь :)

А вообще, скоро Гугль со своим Chrome OS сделает всё это нерелевантным. :)

[identity profile] yurakolotov.livejournal.com 2012-06-04 04:35 am (UTC)(link)
Насчёт грепа - согласен, не хватает.