Russian Qt Forum
Ноябрь 23, 2024, 06:49 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Алхимия командной строки  (Прочитано 10545 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« : Июнь 05, 2013, 11:12 »

Добрый день

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

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

Спасибо
Записан
mutineer
Гость
« Ответ #1 : Июнь 05, 2013, 11:32 »

Код:
find . -name .svn -print0
Находит в текущей директории и ниже все сущности с именем .svn и выводит путь к ним на печать используя символ \0 как разделитель

Код:
xargs -0 rm -r
Берет ввод из stdin, разделяет его по символу \0 и отдает каждую запись команде rm -r как аргумент
Записан
Majestio
Гость
« Ответ #2 : Июнь 05, 2013, 11:33 »

Добрый день

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

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

Спасибо

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

Распечатать можно похожей командой: find . -name .svn -print0 | xargs -0 echo
хотя проще find . -name .svn
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #3 : Июнь 05, 2013, 12:07 »

find . -name .svn -print0 | xargs -0 rm -r
можно малость по-проще
Код
Bash
find . -name .svn -exec rm -r {} \;
Записан

Qt 5.11/4.8.7 (X11/Win)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Июнь 05, 2013, 13:12 »

Спасибо, теперь яснее. Еще пара квешнзов

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

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

Необходимость что-то набирать в консоли всегда вызывала у меня большие трудности (ничего не смог запомнить из command.com  Улыбающийся)
Записан
mutineer
Гость
« Ответ #5 : Июнь 05, 2013, 13:18 »

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

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

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

возвращаемое значение чего?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #6 : Июнь 05, 2013, 13:32 »

программы возвращают 0 в случае успеха и ненулевое число в иных случаях
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Июнь 05, 2013, 13:38 »

возвращаемое значение чего?
Ну вот Вы объснили что результат find подается на вход др команды, где он хранится? Каким образом он попадает на stdin (если я верно понял)

программы возвращают 0 в случае успеха и ненулевое число в иных случаях
Это код возрата, а данные-то где?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #8 : Июнь 05, 2013, 14:02 »

данные в stdout, попадают туда наверное с помощью printf, труба (pipe) | перенаправялет вывод на вход следующей команде
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #9 : Июнь 05, 2013, 14:03 »

В случае -exec вместо {}
Записан

Qt 5.11/4.8.7 (X11/Win)
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #10 : Июнь 07, 2013, 03:28 »

Igors, если меня не подводит мой маразм, то вот ещё информация:

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

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

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

Юра.
mutineer
Гость
« Ответ #11 : Июнь 07, 2013, 08:37 »

Igors, если меня не подводит мой маразм, то вот ещё информация:

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

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

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


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

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

З.Ы. Если мы говорим про bash, естественноУлыбающийся
« Последнее редактирование: Июнь 07, 2013, 08:42 от mutineer » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #12 : Июнь 07, 2013, 12:40 »

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

З.Ы. Если мы говорим про bash, естественно:)
Неудобно спрашивать но все же  Улыбающийся Кто там из них bash и "не bash" и в чем разница?

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

Сообщений: 11445


Просмотр профиля
« Ответ #14 : Июнь 07, 2013, 14:00 »

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


Страница сгенерирована за 0.066 секунд. Запросов: 22.