Russian Qt Forum

Программирование => Общий => Тема начата: Igors от Июнь 05, 2013, 11:12



Название: Алхимия командной строки
Отправлено: Igors от Июнь 05, 2013, 11:12
Добрый день

Нужно было избавиться от старого svn, нашел такую "фишку"
Цитировать
find . -name .svn -print0 | xargs -0 rm -r
Ну конечно сделал копии и потом запустил - все норм, все .svn были удалены рекурсивно. Перед этим долго пытался сделать это по-другому (напр svn export) но ничего не выходило.

Можно ли пояснить что значат эти параметры, и каков ход мысли пишущего командную строку? Ну вот напр мне хотелось бы распечатать все .svn (или .git) с полными путями пока не трогая их. Как это сделать?

Спасибо


Название: Re: Алхимия командной строки
Отправлено: mutineer от Июнь 05, 2013, 11:32
Код:
find . -name .svn -print0
Находит в текущей директории и ниже все сущности с именем .svn и выводит путь к ним на печать используя символ \0 как разделитель

Код:
xargs -0 rm -r
Берет ввод из stdin, разделяет его по символу \0 и отдает каждую запись команде rm -r как аргумент


Название: Re: Алхимия командной строки
Отправлено: Majestio от Июнь 05, 2013, 11:33
Добрый день

Нужно было избавиться от старого svn, нашел такую "фишку"
Цитировать
find . -name .svn -print0 | xargs -0 rm -r
Ну конечно сделал копии и потом запустил - все норм, все .svn были удалены рекурсивно. Перед этим долго пытался сделать это по-другому (напр svn export) но ничего не выходило.

Можно ли пояснить что значат эти параметры, и каков ход мысли пишущего командную строку? Ну вот напр мне хотелось бы распечатать все .svn (или .git) с полными путями пока не трогая их. Как это сделать?

Спасибо

Используются две команды: find (http://ru.wikipedia.org/wiki/Find) и xargs (http://ru.wikipedia.org/wiki/Xargs)
команда find ищет файлы по имени .svn и передает найденное команде xarg. Последняя в свою очередь выполняет "rm -r" (рекурсивоное удаление) с переданными аргументами.

Распечатать можно похожей командой: find . -name .svn -print0 | xargs -0 echo
хотя проще find . -name .svn


Название: Re: Алхимия командной строки
Отправлено: GreatSnake от Июнь 05, 2013, 12:07
find . -name .svn -print0 | xargs -0 rm -r
можно малость по-проще
Код
Bash
find . -name .svn -exec rm -r {} \;


Название: Re: Алхимия командной строки
Отправлено: Igors от Июнь 05, 2013, 13:12
Спасибо, теперь яснее. Еще пара квешнзов

А где кончаются аргументы одной команды и начинается др команда? В исходном примере это вроде |, а тут сразу "rm"? Или это аргумент для -exec?

И где возвращаемое значение? То есть как бы во внутреннем буфере и echo выводит его на stdout? Тогда почему  find . -name .svn выводит без всякого эха?

Необходимость что-то набирать в консоли всегда вызывала у меня большие трудности (ничего не смог запомнить из command.com  :))


Название: Re: Алхимия командной строки
Отправлено: mutineer от Июнь 05, 2013, 13:18
А где кончаются аргументы одной команды и начинается др команда? В исходном примере это вроде |, а тут сразу "rm"? Или это аргумент для -exec?

Да, это аргумент для ключа -exec команды find

И где возвращаемое значение? То есть как бы во внутреннем буфере и echo выводит его на stdout? Тогда почему  find . -name .svn выводит без всякого эха?

возвращаемое значение чего?


Название: Re: Алхимия командной строки
Отправлено: kambala от Июнь 05, 2013, 13:32
программы возвращают 0 в случае успеха и ненулевое число в иных случаях


Название: Re: Алхимия командной строки
Отправлено: Igors от Июнь 05, 2013, 13:38
возвращаемое значение чего?
Ну вот Вы объснили что результат find подается на вход др команды, где он хранится? Каким образом он попадает на stdin (если я верно понял)

программы возвращают 0 в случае успеха и ненулевое число в иных случаях
Это код возрата, а данные-то где?


Название: Re: Алхимия командной строки
Отправлено: kambala от Июнь 05, 2013, 14:02
данные в stdout, попадают туда наверное с помощью printf, труба (pipe) | перенаправялет вывод на вход следующей команде


Название: Re: Алхимия командной строки
Отправлено: GreatSnake от Июнь 05, 2013, 14:03
В случае -exec вместо {}


Название: Re: Алхимия командной строки
Отправлено: lit-uriy от Июнь 07, 2013, 03:28
Igors, если меня не подводит мой маразм, то вот ещё информация:

Вертикальная черта - это логическая операция ИЛИ.
Есть ещё & - операция И
Т.е. запись в командной строке:
команда1 & команда2
даёт следующее - если команда1 завершится неудачно, то вторая команда выполнятся не будет

команда1 | команда2
даёт следующее - если команда1 завершится неудачно, то вторая команда всё равно выполнится

В обоих случаях вывод первой команды в stdout будет подан на stdin второй команды


Название: Re: Алхимия командной строки
Отправлено: mutineer от Июнь 07, 2013, 08:37
Igors, если меня не подводит мой маразм, то вот ещё информация:

Вертикальная черта - это логическая операция ИЛИ.
Есть ещё & - операция И
Т.е. запись в командной строке:
команда1 & команда2
даёт следующее - если команда1 завершится неудачно, то вторая команда выполнятся не будет

команда1 | команда2
даёт следующее - если команда1 завершится неудачно, то вторая команда всё равно выполнится

В обоих случаях вывод первой команды в stdout будет подан на stdin второй команды


Подводит - в баше вертикальная черта это пайп (перенаправление вывода одной команды на ввод другой). А логические операции осуществляются через && и ||

И в обоих случаях логических операций вывод обеих команд будет выдан на консоль, перенаправления не будет

З.Ы. Если мы говорим про bash, естественно:)


Название: Re: Алхимия командной строки
Отправлено: Igors от Июнь 07, 2013, 12:40
З.Ы. Если мы говорим про bash, естественно:)
Неудобно спрашивать но все же  :) Кто там из них bash и "не bash" и в чем разница?


Название: Re: Алхимия командной строки
Отправлено: mutineer от Июнь 07, 2013, 12:50
З.Ы. Если мы говорим про bash, естественно:)
Неудобно спрашивать но все же  :) Кто там из них bash и "не bash" и в чем разница?

Bash - интерпретатор командной строки. В популярных дистрибутивах является дефолтным. Именно он делает пайпы, перенаправления, подсказывает по табу и др. Есть и другие интерпретаторы, у них синтаксис логических операций может быть другим


Название: Re: Алхимия командной строки
Отправлено: Igors от Июнь 07, 2013, 14:00
Bash - интерпретатор командной строки. В популярных дистрибутивах является дефолтным. Именно он делает пайпы, перенаправления, подсказывает по табу и др. Есть и другие интерпретаторы, у них синтаксис логических операций может быть другим
Понял, спасибо


Название: Re: Алхимия командной строки
Отправлено: tester64 от Июнь 07, 2013, 14:47
Кто там из них bash и "не bash" и в чем разница?

Вначале было слово был Bourne shell (семидесятые, времена первых UNIX и C).
Потом командных интерпретаторов расплодилось неимоверное количество, но получила распространение пара - ksh (Korn Shell, на основе Bourne shell)  и csh (C shell). ksh лёг в основу POSIX-стандарта и постепенно вытеснил csh (девяностые). Параллельно развивался bash (появился в 1989 году) и в начале 2000-х вытеснил, параллельно с ростом популярности GNU и Linux, прочие варианты.

По языку bash - надмножество Bourne shell (http://en.wikipedia.org/wiki/Bourne_shell).
Может работать в POSIX-режиме (когда вызывается с ключом --posix или через симлинк sh в ряде дистрибутивов Linux) или своём основном расширенном режиме. На практике большинство скриптов ограничиваются возможностями POSIX, даже когда в них указывается "#!/bin/bash".
Описание языка Bourne shell можно почитать например здесь: An Introduction to the Unix Shell (http://www.ceri.memphis.edu/computer/docs/unix/bshell.htm).

Из существенных расширений bash - математика, рекурсивный глоб (**/...), глоб-перечисление ({jpg,png}), регэкспы, ассоциативные массивы.
Детальнее - на вики (http://en.wikipedia.org/wiki/Bash_%28Unix_shell%29).

Табличное сравнение интерпретаторов можно посмотреть там же (http://en.wikipedia.org/wiki/Comparison_of_computer_shells).
Немного об отличиях старого sh и  bash на StackOverflow (http://stackoverflow.com/questions/5725296/difference-between-sh-and-bash).


Название: Re: Алхимия командной строки
Отправлено: Alex Custov от Июнь 07, 2013, 18:25
А почему с svn export не выходило?


Название: Re: Алхимия командной строки
Отправлено: Igors от Июнь 07, 2013, 19:04
А почему с svn export не выходило?
Да хз, проект старый, Xcode показывает типа svn:/66.77.88 (какой-то явно приблудный IP адрес), если я его даю (в параметрах svn) он бросается туда, а на машине инета вообще нет. Ну и на этом все кончалось - нет доступа к репозиту. Почитал - вроде git приятнее, решил его использовать, все равно из старого репозита ни одного нормального отката не было (я и не знал о его существовании).


Название: Re: Алхимия командной строки
Отправлено: GreatSnake от Июнь 08, 2013, 11:28
Igors, если меня не подводит мой маразм, то вот ещё информация:

Вертикальная черта - это логическая операция ИЛИ.
Есть ещё & - операция И
Т.е. запись в командной строке:
команда1 & команда2
даёт следующее - если команда1 завершится неудачно, то вторая команда выполнятся не будет

команда1 | команда2
даёт следующее - если команда1 завершится неудачно, то вторая команда всё равно выполнится

В обоих случаях вывод первой команды в stdout будет подан на stdin второй команды

Маразм тебя малость подвёл)
&& - И
|| - ИЛИ
& - отправить процесс в background
| - pipe


Название: Re: Алхимия командной строки
Отправлено: lit-uriy от Июнь 08, 2013, 20:01
может это у меня из-за виндузятной командной строки, в ней перенаправление так делается
<<
и
>>


Название: Re: Алхимия командной строки
Отправлено: mutineer от Июнь 08, 2013, 20:15
может это у меня из-за виндузятной командной строки, в ней перенаправление так делается
<<
и
>>


Ну да, в линуксовой консоли перенаправление тоже делается через <,<<,>>,>. А еще есть пайп (|), который в каком-то смысле тоже перенаправление, только перенаправляет не в файл, а на вход другому процессу


Название: Re: Алхимия командной строки
Отправлено: Alex Custov от Июнь 09, 2013, 11:25
А почему с svn export не выходило?
Да хз, проект старый, Xcode показывает типа svn:/66.77.88 (какой-то явно приблудный IP адрес), если я его даю (в параметрах svn) он бросается туда, а на машине инета вообще нет. Ну и на этом все кончалось - нет доступа к репозиту. Почитал - вроде git приятнее, решил его использовать, все равно из старого репозита ни одного нормального отката не было (я и не знал о его существовании).

Так svn export можно делать и в локальной копии. Заходишь в проект,и пишешь

Код:
svn export . ../project-wo-svn