LPIC 103.4 Использование потоков, конвейров и перенаправлений
HTML-код
- Опубликовано: 12 сен 2024
- Отвечаем на следующие вопросы:
- что такое стандартный ввод и вывод в Linux?
- как перенаправить вывод команды в файл в Linux?
- как получить вводные данные для команды из файла в Linux?
- как передать вывод одной команды на ввод другой в Linux?
- как вывести ошибки выполнения команды в файл в Linux?
Свежий мануал: github.com/ksemaev
Про xargs наврал и не привёл самые распространенные примеры. Вкратце, если find -name "*.txt" выведет 3 файла:
1.txt
2.txt
3.txt
то find -name "*.txt" | xargs rm будет прямым эквивалентом команды
rm 1.txt 2.txt 3.txt
т.е. rm будет выполнена 1 раз, а не "построчно" как сказано в видео. Во-вторых, если имя файла содержит пробел - этот номер не пройдёт. В-третьих, длина команды и её аргументов ограничена(MAX_ARGS) и команда xargs позволяет обойти это ограничение. Грубо говоря, если в выше приведённом примере find находит не 3 файла, а миллион(M), то он вызовет команду не миллион раз, а M/MAX_ARGS раз, т.е. значительно меньше раз будет вызвана команда.
Отлично, действительно соврал, меня не так учили, а на такой важный нюанс внимания не обратил, правлю поверх видео. Спасибо!
Но при этом find . -name "*.txt" | xargs -I {} echo {} '---'
./lpic_1-101/homework/103_5_dz.txt ---
./lpic_1-101/homework/104_4_dz.txt ---
./lpic_1-101/homework/102_5_dz.txt ---
./lpic_1-101/homework/102_3_dz.txt ---
Бесценный материал!
Благодарю за урок
Просто лучший!
grep - это скорее фильтрация по содержимому, а не сортировка. Для сортировки мы юзаем sort обычно...
прямо не скорее, а так и есть.
grep ищет подстроку в строке
Балдежный видос, сапсибо
большое спасибо, Кирилл
Ну тут не по именам лучше, а по датам так искать 10:00
Ибо rm, на сколько я помню, сам умеет звездочки обрабатывать
Объясните. Есть возможность скомбинировать команды tee и grep?
Записать отфильтрованные данные в файл через grep и с помощью tee вывести на экран?
Почему нельзя просто сделать find . -name "*.txt" | rm -rf ?
Ключ -f глушит весь вывод. Без него в таком виде rm вернет ошибку об отсутствующем аргументе
можно вызвать вовсе без find
rm -rf *.txt
Это учебный пример. Он мог ещё проще rm -rf *.txt
Еще один вопросик - понятно что значит
Опять ютуб не оповестил о комменте(( Евгений ответил, ему - спасибо!
Я кстати так и не смог найти нормальное описание всех этих символов, может вы подскажете где их искать? Например тут ru.wikipedia.org/wiki/Bash уже даже
triple less,
На 03:15 при записи ls>list.txt в новый файл записывается также имя нашего нового файла - list.txt. Это что же получается, > опережает время и берет список из будущего?) как этого избежать? недавно сам с этим столкнулся, когда создавал txt со списком файлов, пришлось заходить и вручную удалять эту лишнюю строчку
+Eduard Bulatov ну это же не совсем из будущего)) На тот момент что вы смотрите в файл он уже находится в папке, поэтому его содержимое справедливо. Хотя конечно понимаю, в момент выполнения команды ls файла еще не было, я как-то на это никогда не обращал внимания)
Можно написать скрипт простой, или функцию, которая будет выполнять тот же самый ls в файл 123213213213.txt, например, а потом находить в созданном файле эту строку "123213213213.txt" и удалять её
+Kirill Semaev спасибо, Кирилл! Классные уроки, так держать
Если совсем правильно, то перенаправлением потоков () занимается ваша оболочка (bash), она же вызывает набранные вами команды. Сначала происходит перенаправление (и создание файла), а потом вызов команды ls.
А почему сначала происходит перенаправление?
Оболочка (bash) обрабатывает всё что вы ему вводите с клавиатуры. Символы перенаправления - это указание для оболочки а не для команды. Команда вообще не в курсе что вы что-то изменили, она как читала со стандартного ввода, так и читает (или пишет в стандартный вывод). Вы просто изменили сам стандартный ввод/вывод на что-то другое (изменили значения "файловых" дескрипторов стандартных потоков на другие "файлы"). Соответственно, bash перед вызовом команды подготавливает её окружение - меняет значения перенаправленных дескрипторов на указанные, создаёт файлы, если их нет (чтобы получить файловый дескриптор) а затем выполняет команду.
for по моему опыту существенно практичнее, чем xargs
А как сделать перемещение, найденных файлов командой find через конвейер с использованием xargs? в этом случае нужно команде mv уже 2 аргумента вместо одного для команды rm
не понимаю, вы их хотите в разные места двигать? Дайте пример
@@KirillSemaev просто вместо команды rm попробуйте применить команду mv в той же связке.
Спасибо за урок!
Вопрос по ДЗ:
не разберусь как сделать это задание:
5) Вывести результат команды ping it-semaev.ru в консоль, отображая только последние пять символов каждой строки..
пните где искать ...
Спасибо!
Ну можно попробовать так: stackoverflow.com/questions/9219964/bash-get-the-last-4-characters-of-output-from-standard-out-inline
Я сделал так ping -c 10 it-semaev.ru | rev | cut -c 1-5 | rev
Вот еще так можно: ping -c 10 it-semaev.ru | awk '{ print substr( $0, length($0) - 4, length($0) ) }'
Жаль что раньше Я не видел твоих видосов !!! Другие показывают просто фуфло !!!
я думал, зачем find . -name "*.txt" | xargs rm ... Ведь можно rm *.txt , но дело именно в количестве вызовов команды rm
СПАСИБО!