- Запись файлов в Bash
- Запись в файл с использованием операторов перенаправления
- Запись в файл с помощью команды tee
- Выводы
- Как перезаписать содержимое всех текстовых файлов содержимым одного файла?
- Запись в файлы с помощью команды cat в Linux
- Основы команд cat
- Синтаксис
- Отображение содержимого файла на стандартном выводе
- Запись текста в файл с помощью cat
- Объединение файлов с помощью cat
- Стандартный ввод между файлами
- Добавление файлов с помощью cat
- Объединение содержимого всего каталога файлов с помощью cat
- Перечисление номеров строк
- Напишите $ в конце каждой строки
- Сортировка строк составных файлов по конвейеру
- Вывод
Запись файлов в Bash
Одна из наиболее распространенных задач при написании сценариев Bash или работе в командной строке Linux — это чтение и запись файлов.
В этой статье объясняется, как записать текст в файл в Bash с помощью операторов перенаправления и команды tee .
Запись в файл с использованием операторов перенаправления
В Bash перенаправление вывода позволяет вам захватить вывод команды и записать его в файл.
Общий формат перенаправления и записи вывода в файл следующий:
- Оператор перенаправления > записывает вывод в указанный файл. Если файл существует, он обрезается до нулевой длины. В противном случае файл создается. Будьте особенно осторожны при использовании этого оператора, так как вы можете перезаписать важный файл.
- Оператор перенаправления >> добавляет вывод в указанный файл. Если файл не существует, он создается.
У вас должны быть права на запись в файл. В противном случае вы получите сообщение об ошибке в разрешении отказано.
Вот простой пример, показывающий, как перенаправить вывод команды echo в файл:
Чтобы предотвратить перезапись существующих файлов, включите опцию «noclobber» с помощью встроенной команды set :
>| оператор позволяет вам переопределить параметр Bash «noclobber»
Оператор >> добавляет вывод в конец файла, а не перезаписывает файл:
Используйте команду printf если вы хотите создать сложный вывод:
Если вы хотите записать несколько строк в файл, используйте перенаправление документа Here (Heredoc).
Например, вы можете передать содержимое команде cat и записать его в файл:
Чтобы добавить строки, замените > на >> перед именем файла:
Вы можете записать вывод любой команды в файл:
Вывод команды date будет записан в файл.
Запись в файл с помощью команды tee
Команда tee читает из стандартного ввода и записывает как в стандартный вывод, так и в один или несколько файлов одновременно.
По умолчанию команда tee перезаписывает указанный файл, как и оператор > . Чтобы добавить вывод в файл, вызовите команду с параметром -a ( —append ):
Если вы не хотите, чтобы tee выводил данные на стандартный вывод, вы можете перенаправить его на /dev/null :
Чтобы записать текст в несколько файлов, укажите файлы в качестве аргументов команды tee :
Еще одно преимущество команды tee заключается в том, что вы можете использовать ее вместе с sudo и записывать в файлы, принадлежащие другим пользователям. Чтобы добавить текст в файл, в который у вас нет прав на запись, добавьте sudo перед tee :
Выходные данные команды echo передаются как входные в tee , который повышает разрешения sudo и записывает текст в файл.
Выводы
В Linux для записи текста в файл используйте операторы перенаправления > и >> или команду tee .
Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.
Источник
Как перезаписать содержимое всех текстовых файлов содержимым одного файла?
Есть папка в которой расположена куча файлов с расширением .srf (текстовые файлы).
Есть файл sample.srf содержимым которого надо перезаписать содержимое всех .srf файлов в указаной папке.
find ./ -type f -name «*.srf» -exec cat /path/to/sample.srf > ‘<>‘ \;
Перед обратным слешем ты пропустил пробел.
И чем вам ‘cp’ не угодил?
Это всё равно не будет работать. Ну никак вообще, тут минимум 2 ошибки.
Почитай пожалуйста man bash раздел REDERECTION обрати внимание на символ > . Затем загляни в man find почитай справку по -exec разберись с тем, что он не вызывает шел.
Так REDIRECT у тебя ломает всю логику find , но если решить эту проблему, то всплывает вторая проблема. Если в -exec не использовать shell, то cat будет считать файлом >
Чтобы это работало так как задумано, должно быть примерно так:
Это хоть и работает, но не проще ли использовать cp , ведь перезаписанный файл эквивалент скопированного:
Это такое масло масляное, что у меня даже с монитора потекло. Кроме всего прочего ещё и уязвимое к именам файлом.
Это такое масло масляное, что у меня даже с монитора потекло. Кроме всего прочего ещё и уязвимое к именам файлом.
Печальная тендеция, когда народ стал воспринимать сообщения из stackoverflow как верх правильности 🙁
Кроме всего прочего ещё и уязвимое к именам файлом.
Кстати, да. У меня выбивало ошибки что мол некоторые srf -файлы не найдены, при этом показывало список из нескольких файлов *.srf .
Как говорит один местный корректор, который метит в модераторы -«орнул в голосину». Ты так хорошо оформил пост, а опечатку капсом не заметил.
Всё верно. Я показал принцип работы. Команду не запускал, а комент писал с телефона.
Зацепился за фразу ТС про содержимое файла. Как уже в этом треде правильно подметили, cp в данном случае лучше. Я лишь показал пример, как использовать find для таких простых задач.
Как уже в этом треде правильно подметили, cp в данном случае лучше.
Не так всё было. Мне было лень расписывать, но нашелся добрый человек, который не поленился объяснить, что дело вовсе не в «лучше»…
Вот я не пойму, зачем ты к словам придираешься? Повторяю: я дал совет использовать find. Что конкретно надо использовать в -exec на усмотрение пользователя. Я уже дважды написал, что cat, который я вписал в команду с телефона по памяти, тут не подходит. Но нет, ты все-равно продолжаешь о чём-то спорить.
надо перезаписать содержимое всех — файлов
Чё, на подходе новый вирус шифровальщик на баше ?
Вот я не пойму, зачем ты к словам придираешься?
Потому что вы попытались обмануть, «лучше» означает что оно работает, но есть способ сделать по другому с некими критериями «лучше». А у вас было в принципе неправильно.
Я уже дважды написал, что cat, который я вписал в команду с телефона по памяти, тут не подходит.
Ну вот опять 25. Почему не подходит? Вам дали скрипт с cat, и оно как раз из разряда «хуже».
Повторяю: я дал совет использовать find.
А вот тут как раз и плохой совет. Оно тут нафиг не нужно. «Есть папка в которой расположена куча файлов с расширением .srf » (c) ТС. Накой тут find? Если бы там был, скажем -delete (хотя тоже не posix-стандарт) оно ещё имело бы смысл, но тут одна папка и куча fork-ов на bash, который тоже бы форкался на cat.
Эпично. То, что ты перезаписываешь sample.srf, не забыл? Потенциально содержание может отличаться, а значит это приведет к совсем не тому результату, что ожидает ТС. Неправильный пример, я считаю. Правильно сначала вынести sample.srf подальше, а потом проводить копирование.
А чо сразу cp ? Здравый смысл подсказывает хардкор: т.е. первый файл — cp , остальные — ln -f на первый.
Эпично. То, что ты перезаписываешь sample.srf, не забыл?
Тут все примеры этим грешат и подразумевается, что это надо проверять дополнительно. И как раз в этот однострочник эту проверку сделать наиболее просто. Но ведь оно просто ругнется и ничего особо страшного на самом деле не произойдёт.
См выше — то что копируется тоже такой же выходной файл, и потому и не надо первый/последующие. Но куча хардлинков непонятно накой надо в одном каталоге, может у него потом в каждый будет внесено маленькое изменение и хардлинки будут только мешать.
куча хардлинков непонятно накой надо в одном каталоге
Только для одного: ему нужна структура каталогов и файлов без содержимого именно в виде структуры файлов.
Только для одного: ему нужна структура каталогов и файлов без содержимого именно в виде структуры файлов.
Какая-то чушь спора ради спора. У него и так уже есть структура, содержимое только разное. Что потом будет нет смысла гадать, всё что угодно, может и это только шапки файлов, которые будут дополняться и так далее.
Самый простой ответ. Чего то там выше наворочили, не пойму..
Потому что вы попытались обмануть
Строить теории об обмане и интригах вокруг однострочника, который написан по памяти для разовой задачи за пять секунд — это очень круто.
А ещё круто не читать коментарии. Про cat уже никто ничего не говорит, но ты всё ещё цепляешься за него.
Какие теории? Натуральный факт.
вокруг однострочника, который написан по памяти для разовой задачи за пять секунд — это очень круто.
К этому вам никто не предъявляет претензии. Все люди могут ошибаться. Но почему-то тут принято юлить и хамить, переводить стрелки.
Про cat уже никто ничего не говорит, но ты всё ещё цепляешься за него.
Именно вы вот только всё время про него говорите, вот опять только что.
Как я уже говорил выше, спасибо за технические замечания.
А твой троллинг довольно уныл. Удачи.
А твой троллинг довольно уныл. Удачи.
Вот и я говорю, что без хамства и прочего «сам дурак» ну никак тут не могут.
Источник
Запись в файлы с помощью команды cat в Linux
Команда cat представляет собой инструмент Unix, используемый для управления и отображения содержимого файлов. Команда получила свое название от слова «concatenate», потому что, помимо прочего, она может объединять файлы.
В этой статье мы рассмотрим несколько простых способов использования этой команды для записи текста в файл с примерами. Использование cat очень простое, поэтому для продолжения работы не требуется никакого предварительного программирования или опыта работы с Unix.
Основы команд cat
Начнем с того, что мы просто опишем основы команды cat , чтобы помочь вам, если вы никогда не использовали ее раньше или вам нужен краткий обзор.
Синтаксис
Синтаксис выглядит так:
Чтобы быстро найти синтаксис или параметры команды, запустите cat с параметром справки:
Или, вы можете использовать:
Эти команды должны отображать следующий список параметров:
Отображение содержимого файла на стандартном выводе
Чтобы вывести содержимое файла на стандартный вывод, просто назовите файл, который хотите отобразить:
Если файл находится в другом каталоге, вам нужно указать его:
Мы ожидаем увидеть содержимое этого файла, распечатанное на стандартный вывод, в данном случае — терминал:
Это наиболее распространенное использование команды cat, поскольку она позволяет легко просматривать содержимое файла, не открывая текстовый редактор.
Запись текста в файл с помощью cat
Чтобы перенаправить вывод команды cat из стандартного вывода в файл, мы можем использовать оператор перенаправления вывода > :
Это приведет к замене содержимого filename2 на содержимое filename1 , поэтому убедитесь, что он не содержит ничего, что вы бы не хотели потерять. Теперь filename2 содержит:
Оператор перенаправления вывода перенаправит вывод любой вызываемой нами команды. Например, давайте попробуем это с помощью команды pwd , которая печатает имя текущего рабочего каталога:
Если мы посмотрим сейчас на testfile :
Он содержит путь к текущему рабочему каталогу:
Если файл, на который вы перенаправляете, не существует, будет создан файл с таким именем:
Объединение файлов с помощью cat
Объединить несколько файлов с помощью cat очень просто — просто перечислите файлы в желаемом порядке:
Этот код берет файлы filename1 и filename2 , сцепляет их и выводит на новый outputfile :
Стандартный ввод между файлами
Когда имя входного файла отсутствует в списке, cat начинает чтение со стандартного ввода до тех пор, пока не достигнет EOF (конца файла). Сигнал о конце файла отправляется ctrl+d в командной строке:
Мы даже можем добавить текст из стандартного ввода между файлами, которые мы хотим объединить, используя — , чтобы указать, где мы ожидаем стандартный ввод. Если у нас есть такие файлы, как filename1 , filename2 и filename3 , и нам нужен текст из стандартного ввода между filename1 и filename2 , мы должны написать:
Проверив output , мы увидим что-то вроде:
Добавление файлов с помощью cat
В предыдущих примерах использование оператора перенаправления отбрасывало предыдущее содержимое файла output . Что, если мы хотим добавить новый контент к старому? Для добавления файлов мы используем оператор >> :
И это должно привести к:
Объединение содержимого всего каталога файлов с помощью cat
Чтобы объединить все содержимое всех файлов в каталоге, мы используем подстановочный знак * :
Чтобы объединить все содержимое всех файлов в текущем рабочем каталоге, мы будем использовать:
* также можно использовать для объединения всех файлов с одинаковым расширением:
Перечисление номеров строк
Перечисление всех строк вывода осуществляется с помощью опции -n :
Что бы написать что-то вроде:
Напишите $ в конце каждой строки
В опции -E знаменует конец каждой строки в файле с $ :
Сортировка строк составных файлов по конвейеру
Это немного обман. Команда cat не может сортировать, но для этого мы можем использовать конвейер. Команда канала ( | ) используется для превращения вывода одной команды во ввод другой. Чтобы отсортировать строки файла, мы будем использовать обе cat и еще одну команду sort :
Вывод
Cat — это простой, но мощный инструмент Unix, который предустановлен в большинстве систем. Его можно использовать отдельно или в сочетании с другими командами с помощью каналов. Первоначально созданный Кеном Томпсоном и Деннисом Ритчи в 1971 году, cat простой в использовании и интуитивно понятный функционал выдерживает испытание временем.
В этой статье мы изучили некоторые возможности использования команды cat для записи текста в файлы, проверки содержимого, объединения и добавления файлов, а также для перечисления строк и их сортировки.
Источник