xargs
xargs
Красивая картинка №1
У xargs тоже есть аргументы
Полная команда | Левая часть | Правая часть |
xargs rm -rf | xargs | rm -rf |
xargs -p -l gzip | xargs -p -l | gzip |
xargs tar -zcf pl.tar.gz | xargs | tar -zcf pl.tar.gz |
xargs -I file mv | xargs -I file | mv |
Красивая картинка
Выполним команду
main.cpp
main.h
version.cpp
version.h
config.cpp
config.h
data.cpp
data.h
$find . -name "*.cpp" | xargs rm -rf
Результат
Файлы удалятся!
Результат
$find . -name "*.cpp" | xargs rm -rf
Файлы удалятся!
Какие команды были выполнены?
rm -rf main.cpp
Результат
$find . -name "*.cpp" | xargs rm -rf
Файлы удалятся!
Какие команды были выполнены?
rm -rf main.cpp
rm -rf main.h
Результат
$find . -name "*.cpp" | xargs rm -rf
Файлы удалятся!
Какие команды были выполнены?
rm -rf main.cpp
rm -rf main.h
…
Нет!
Результат
$find . -name "*.cpp" | xargs rm -rf
Файлы удалятся!
Какие команды были выполнены?
rm -rf main.cpp
rm -rf main.h
…
Нет!
rm -rf main.cpp main.h ...
Почему?
Потому что входной поток данных был разбит, но не для того
Почему?
Потому что входной поток данных был разбит, но не для того
Как решить?
find . -name "*.cpp" | xargs -n 1 rm -rf
Почему предыдущая команда сработала?
Почему?
Потому что входной поток данных был разбит, но не для того
Как решить?
find . -name "*.cpp" | xargs -n 1 rm -rf
Почему предыдущая команда сработала?
Потому что rm может работать с некоторыми файлами
Так может и хорошо, зачем что-то менять?
Почему?
Потому что входной поток данных был разбит, но не для того
Как решить?
find . -name "*.cpp" | xargs -n 1 rm -rf
Почему предыдущая команда сработала?
Потому что rm может работать с некоторыми файлами
Так может и хорошо, зачем что-то менять?
Если вход очень большой, то поток принудительно разобьётся на несколько частей. В самом неожиданном месте
Как понять что было вызвано?
xargs -t
Пробелы в именах файлах
$ find . -name "*.cpp"
$ find . -name "*.cpp" | xargs -n 1 -t rm -rf
???
Пробелы в именах файлах
$ find . -name "*.cpp"
$ find . -name "*.cpp" | xargs -n 1 -t rm -rf
Пробелы в именах файлах
$ find . -name "*.cpp" -print0 | xargs -n 1 -t --null rm -rf
Без аргументов
Что будет если вызвать без аргументов?
tr -dc A-Za-z0-9_ < /dev/urandom | head -c 10 | xargs
Без аргументов
Что будет если вызвать без аргументов?
tr -dc A-Za-z0-9_ < /dev/urandom | head -c 10 | xargs
Вызовется echo:
$tr -dc A-Za-z0-9_ < /dev/urandom | head -c 10 | xargs
jfkfEldp3w
$
Без аргументов
Что будет если вызвать без аргументов?
tr -dc A-Za-z0-9_ < /dev/urandom | head -c 10 | xargs
Без xargs:
$tr -dc A-Za-z0-9_ < /dev/urandom | head -c 10
jfkfEldp3w $
Интересные опции
Проблемы
Интересные опции
Проблемы
Интересные опции