Linux записывает в несколько файлов

Обновлено: 03.07.2024

На предыдущем уроке мы анализировали значения из выходных файлов. Хотя вы, возможно, видели полезность такой вещи, вы также могли задаться вопросом, почему мы просто не искали файл, вырезали и вставляли нужные значения в электронную таблицу. Если у вас есть только 1 или 2 файла, это может быть очень разумным решением. Но что, если бы вам нужно было проанализировать 100 файлов? А если бы у вас было 1000? В таком случае метод вырезания и вставки будет очень утомительным и трудоемким.

Одно из реальных преимуществ написания программы для анализа ваших данных заключается в том, что вы можете так же легко анализировать 100 файлов, как и 1 файл. В этом примере мы собираемся проанализировать выходные файлы для целой серии соединений алифатических спиртов и проанализировать значение энергии для каждого из них. Все выходные файлы сохраняются в папке с именем outfiles, которую вы должны были загрузить при установке для этого урока. Убедитесь, что папка находится в том же каталоге, что и каталог, в котором вы пишете и выполняете свой код.

Для анализа нескольких файлов нам потребуется импортировать библиотеку Python. Библиотека — это набор модулей, содержащих функции. Функции внутри библиотеки или модуля обычно связаны друг с другом. Использование библиотек и Python уменьшает объем кода, который вам нужно написать. На прошлом уроке мы импортировали os.path — модуль, обрабатывающий для нас пути к файлам.

В этом уроке мы будем использовать библиотеку glob, которая поможет нам читать несколько файлов с нашего компьютера. В библиотеке есть модули и функции, которые выполняют определенную вычислительную задачу. Обычно функция имеет некоторый тип ввода и дает определенный вывод. Чтобы использовать функцию, которая находится в библиотеке, вы часто используете точечную нотацию, введенную в предыдущем уроке. В целом

Мы собираемся импортировать две библиотеки. Одной из них является библиотека os, которая управляет функциями, связанными с операционной системой вашего компьютера. Мы использовали эту библиотеку в прошлом уроке для обработки путей к файлам. Другая — это библиотека glob, которая содержит функции, помогающие нам анализировать несколько файлов. Если мы собираемся анализировать несколько файлов, нам сначала нужно указать, где эти файлы расположены.

Упражнение

Как бы вы использовали модуль os.path, чтобы указать каталог, в котором находятся ваши выходные файлы?

Решение

Чтобы получить все файлы, соответствующие определенному шаблону, мы будем использовать подстановочный знак * .

Информационный аватар участника

1 622, 11 

Я новичок в написании сценариев оболочки, и у меня есть вопрос. Я хотел бы перенаправить вывод команды в несколько файлов, каждый из которых содержит одну и ту же копию. Из того, что я прочитал на странице руководства bash, и из некоторых поисков кажется, что это невозможно сделать в оболочке, кроме как настроить цикл. Это?

Информационный аватар участника

207, 1

В Unix для этого есть красивая команда: "tee"

кто | tee -a файл1 файл2 файл3 файл4

это запишет вывод кто на ваш экран, файл1, файл2, файл3 и файл4.

Пожалуйста, смотрите "мужскую футболку" для получения подробной информации.

Информационный аватар участника

1 622, 11 

Большое спасибо за ответ.

В ходе поиска я обнаружил, что `tee' может это сделать. Однако на самом деле я хотел бы спросить, можно ли это сделать непосредственно в оболочке без использования внешних программ, например, в оболочке bash.

Информационный аватар участника

207, 1

Нет, у вас есть одно устройство STDIN, STDOUT, STDERR, перенаправленное на ваш TTY, вы можете перенаправить его в файл, но не в оба, без использования tee.

Если вы ищете это в связи с аудитом пользователей, для этого есть несколько способов. Пожалуйста, сообщите нам, если это так.

Еще 10 обсуждений, которые могут вас заинтересовать

1. Программирование оболочки и создание сценариев

Получение «неоднозначного перенаправления» при попытке запустить команду для нескольких файлов

Обсуждение начато: HLee1981

2. Программирование оболочки и создание сценариев

Перенаправить вывод и ошибку в 2 разных файла

привет, я хочу перенаправить свой вывод и ошибку, если они сгенерированы, в два разных файла. Я написал код для перенаправления вывода, я не знаю, как это сделать для ошибок. Пробовал спулить, который давался в одной из тем на этом форуме. Но не получилось. Скрипт я написал очень много. (4 ответа)

Обсуждение начато: bankimmehta

3. Программирование оболочки и создание сценариев

найти строку из нескольких каталогов и перенаправить в новые файлы

Привет, я новичок в скриптах и ​​хочу найти одну строку из нескольких файлов в разных каталогах и поместить ее в новый файл. Например, у меня есть каталоги A, B и C, и каждый из них имеет несколько файлов, но один файл уникален во всех каталогах, таких как COMM.txt. Теперь я хочу написать скрипт для поиска строки. (8 ответов)

Обсуждение начато: Mahessh123

4. UNIX для чайников, вопросы и ответы

Перенаправить stdin stdout в несколько файлов

Привет, я знаю, как а) перенаправить stdout и stderr в один файл, б) и одновременно записывать в два файла с одним и тем же выводом с помощью команды tee. Теперь я хочу сделать оба вышеперечисленных действия вместе. У меня есть скрипт, и он должен записывать как stdout, так и stderr в один файл, а также записывать одно и то же содержимое. (8 ответов)

Обсуждение начато: ysrini

5. Программирование оболочки и создание сценариев

Как извлечь несколько файлов из таблицы БД и перенаправить все эти файлы в другой каталог?

Привет всем!! У меня есть таблица базы данных, в одном из полей которой есть имя_файла. Пример: File_ID File_Name Размер каталога 0001 UNO_1232 /apps/opt 234 0002 UNO_1234 /apps/opt 788 0003 UNO_1235 /apps/opt 897 0004 UNO_1236 /apps/opt 568 Я должен. (3 ответа)

Обсуждение начато: ss3944

6. Программирование оболочки и создание сценариев

как перенаправить несколько входных файлов?

У меня есть программа, которая работает как "cat f1 - f2 -", мне нужно написать сценарий оболочки для запуска программы, стандартный ввод которой будет перенаправлен из 2 файлов. Я трачу на это целый день, но так и не разобрался. Кто-нибудь может мне помочь? Спасибо! (8 ответов)

Обсуждение начато: microstarwwx

7. Программирование оболочки и создание сценариев

./Test.sh $> Ожидаемый результат: -------------------. " style="color:Navy;">Как перенаправить вывод в несколько файлов, не запуская консоль

Обсуждение начато: prashant43

8. Программирование оболочки и создание сценариев

Динамическое перенаправление вывода в дубликаты файлов.

Здравствуйте! На этом форуме много сообщений о перекодировке вывода, но у меня другая проблема, пожалуйста, посмотрите. Мой сценарий оболочки динамически перенаправляет вывод в файл журнала. То есть используется - exec > log1.txt 2>&1 Следовательно, все следы появляются в log1.txt. Я хочу. (3 ответа)

Обсуждение начато: nsinha

9. Программирование оболочки и создание сценариев

Как перенаправить вывод (ошибочный и нормальный) в 2 разных файла

Здравствуйте, у меня есть Java-программа, которую я вызываю в сценарии оболочки. Я хотел перенаправить вывод в 2 разных файла. Вывод должен иметь как 1, так и 2 (обычный и ошибочный) в обоих файлах. помогите пожалуйста (2 ответа)

CP позволяет копировать каталоги и командные файлы с помощью командной строки. С помощью этой команды вы можете передавать несколько файлов или папок, сохранять информацию об атрибутах и ​​создавать их резервные копии. CP копирует файлы независимо от их оригиналов. Итак, можно сказать, что команда CP полезна для Linux. Люди до сих пор не знают, как использовать эту команду, и ищут ответы относительно копирования нескольких файлов с помощью CP в Linux. Вот почему мы написали эту статью, чтобы кратко описать, как копировать несколько файлов с помощью CP в Linux.

Как скопировать несколько файлов с помощью CP в Linux?

Теперь мы объясним различные способы использования CP для выполнения различных задач.

Скопировать файл с помощью команды CP

Файл, который мы скопируем с помощью команды cp, передает свое имя и место назначения. Мы скопируем файл Linuxhint.txt в новый файл с именем Linuxhintteam.txt, используя команду cp. Во время операции команда cp также создаст новую файловую часть операции.

Сначала выберите папку/каталог, в котором находится файл. В нашем случае файл доступен в каталоге Documents, поэтому мы используем следующую команду:

После использования команды ls для отображения доступного файла в каталоге.

Теперь выполните приведенную ниже команду, чтобы сделать копию определенного файла:

Здесь мы использовали приведенную ниже команду для создания копии файла Linuxhint.txt:

Чтобы убедиться, что файл успешно скопирован, снова используйте команду ls.


Копировать несколько файлов с помощью команды CP

При использовании команды cp для копирования нескольких файлов необходимо указать как имя файла, так и каталог назначения.

Сначала откройте конкретный каталог в терминале и выполните команду дерева. Если вы не знаете о команде дерева, загляните в этот блог.

В папке «Документы» у нас есть два файла, то есть Linuxhint.txt и Linuxhintteam.txt, и одна папка с именем Linuxtricks. Теперь выполните следующую команду в терминале:

Здесь мы использовали следующую команду для копирования файлов Linuxhint.txt и Linuxhintteam.txt в папку Linuxtricks:


Чтобы убедиться, что файлы скопированы, снова используйте команду дерева.

Скопировать каталог с помощью команды CP

Команда CP по умолчанию не копирует каталоги. При копировании каталога выдает ошибку.


Чтобы скопировать каталог с помощью команды cp, мы должны передать флаг -R. Он создает копию путем рекурсивного копирования помеченной папки.

Здесь мы использовали следующую команду для копирования каталогов:


Наконец, выполните команду дерева, чтобы убедиться, что система успешно создала несколько каталогов.

Копировать несколько каталогов с помощью команды CP

Чтобы скопировать несколько каталогов с помощью команды cp, скопируйте путь к каталогу и передайте его после целевого каталога.

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


Теперь выполните приведенную ниже команду, чтобы скопировать несколько каталогов с помощью команды CP:

Здесь мы использовали следующую команду для копирования Linuxtips и Linuxtricks в папку LinuxOS:

Наконец мы убедились, что система правильно скопировала каталоги.


Создавать резервную копию при копировании файла

Мы можем использовать флаг -b для резервного копирования файла, если кто-то перезапишет скопированный файл. Он также создает файл резервной копии, копируя файл на место.

ls
Имя файла.txt ИмяФайла1.txt
cp -b ИмяФайла.txt ИмяФайла1.txt
ls
ИмяФайла.txt ИмяФайла1.txt ИмяФайла1.txt~


В приведенном выше примере Linuxhintteam.txt ~ представляет файл резервной копии.

Запрашивать подтверждение при копировании файла

Мы можем использовать флаг -i для запроса подтверждения при копировании файла. Обычно файл назначения перезаписывается при использовании команды CP. Это происходит в том состоянии, когда файл присутствует в момент копирования. Команда предложит использовать флаг -i для перезаписи файла.


Создайте жесткую ссылку вместо копирования

Мы можем передать флаг -l при создании жесткой ссылки вместо копирования с помощью команды cp. Новый файл создается без копирования файла, который является жесткой ссылкой на данные на диске. Это учебник по программным или символическим и жестким ссылкам.

ls
Filename.txt
Filename1.txt
cp -l Filname.txt Filname1.txt
echo 'Filename1 text' > Filename1.txt
Filename. txt
Текст имени файла

Сохранить атрибуты файла

Опция сохранения передается для сохранения атрибутов файла (т. е. владельца пользователя, группы и разрешений) вместе со свойствами, которые должны быть сохранены по умолчанию, в режиме, который сохраняет временную метку и владельца.

-rw------- 1 Пользователи Linux 0 14 сентября 04:00 bar.txt
cp --preserve bar.txt foo.txt
-rw------ - 1 пользователей Linux 0 14 сентября 04:00 foo.txt
-rw------- 1 пользователей Linux 0 14 сентября 04:00 bar.txt

Показать все скопированные файлы

Опция -v используется в команде Cp для отображения копируемых файлов. Этот параметр позволяет распечатать папки и файлы, которые копируются на стандартный вывод.

cp -R -v Filename Filename1
'Filename' -> 'Filename1'
'Filename/Filename.txt' -> 'Filename1/Filename.txt'
'Filename/Filename1 .txt' -> 'Имя файла1/Имя файла1.txt'

Заключение

В этой статье описывалось, как можно скопировать один или несколько файлов, папок и каталогов с помощью команды CP. Мы объяснили вам множество способов использования команды CP для копирования файлов. Если у вас возникнут какие-либо вопросы относительно этой статьи, не стесняйтесь обращаться к нам.

Об авторе

Пратик Джангид

Увлеченный пользователь Linux по личным и профессиональным причинам, всегда изучает новинки мира Linux и делится ими со своими читателями.

Возьмите свой любимый напиток, редактор и компилятор, включите несколько мелодий и начните структурировать программу на C, состоящую из нескольких файлов.

Клавиатура для программирования.

Часто говорят, что искусство компьютерного программирования частично заключается в управлении сложностью и частичном присвоении имен вещам. Я утверждаю, что это в значительной степени верно с добавлением «иногда это требует рисования прямоугольников».

В этой статье я назову некоторые вещи и устраню некоторые сложности при написании небольшой программы на C, которая в общих чертах основана на структуре программы, которую я обсуждал в разделе "Как написать хорошую основную функцию C", но отличается. Этот что-нибудь сделает. Возьмите свой любимый напиток, редактор и компилятор, включите несколько мелодий, и давайте вместе напишем немного интересную программу на C.

Философия хорошей программы Unix

Первое, что нужно знать об этой программе C, это то, что это инструмент командной строки Unix. Это означает, что он работает (или может быть перенесен) на операционные системы, которые обеспечивают среду выполнения Unix C. Когда Unix была изобретена в Bell Labs, она с самого начала была пропитана философией дизайна. Моими собственными словами: программы делают одно, делают это хорошо и воздействуют на файлы. Хотя имеет смысл делать что-то одно и делать это хорошо, часть о «действиях с файлами» кажется немного неуместной.

Оказывается, абстракция "файла" в Unix очень эффективна. Файл Unix представляет собой поток байтов, который заканчивается маркером конца файла (EOF). Вот и все. Любая другая структура файла определяется приложением, а не операционной системой. Операционная система предоставляет системные вызовы, которые позволяют программе выполнять набор стандартных операций с файлами: открывать, читать, записывать, искать и закрывать (есть и другие, но эти важные). Стандартизация доступа к файлам позволяет различным программам использовать общую абстракцию и работать вместе, даже если разные люди реализуют их на разных языках программирования.

Наличие общего файлового интерфейса позволяет создавать компонуемые программы. Вывод одной программы может быть вводом другой программы. Семейство операционных систем Unix по умолчанию предоставляет три файла при выполнении программы: стандартный ввод (stdin), стандартный вывод (stdout) и стандартный файл ошибок (stderr). Два из этих файлов открыты только для записи: stdout и stderr, а stdin открыт только для чтения. Мы видим это в действии всякий раз, когда используем перенаправление файлов в командной оболочке, такой как Bash:

Эту конструкцию можно кратко описать так: вывод ls записывается в стандартный вывод, который перенаправляется на стандартный ввод grep, чей стандартный вывод перенаправляется на sed, чей стандартный вывод перенаправляется для записи в файл с именем ack в текущем каталог.

Мы хотим, чтобы наша программа хорошо работала в этой экосистеме столь же гибких и замечательных программ, поэтому давайте напишем программу, которая читает и записывает файлы.

MeowMeow: концепция потокового кодировщика/декодера

Когда я был росистым ребенком, изучавшим информатику в s, существовало множество схем кодирования. Некоторые из них предназначались для сжатия файлов, некоторые — для упаковки файлов вместе, а у других не было никакой цели, кроме как быть мучительно глупыми. Примером последней является схема кодирования MooMoo.

Чтобы дать нашей программе цель, я обновлю эту концепцию для 2000-х годов и реализую концепцию, называемую кодированием MeowMeow (поскольку Интернет любит кошек). Основная идея здесь состоит в том, чтобы взять файлы и закодировать каждую часть (половину байта) текстом «мяу». Строчная буква обозначает ноль, а прописная — единицу. Да, это увеличит размер файла, поскольку мы обмениваем 4 бита на 32 бита. Да, это бессмысленно. Но представьте удивление на чьем-то лице, когда это происходит:

Это будет потрясающе.

Реализация, наконец

Полный исходный код можно найти на GitHub, но во время написания я расскажу о своем мыслительном процессе. Цель состоит в том, чтобы проиллюстрировать, как структурировать программу C, состоящую из нескольких файлов.

Уже установив, что я хочу написать программу, кодирующую и декодирующую файлы в формате MeowMeow, я запустил оболочку и ввел следующие команды:

Короче говоря, я создал каталог, полный пустых файлов, и передал их в git.

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

Обычно программа запускается как один простой файл main.c, содержащий только две или три функции, решающие проблему. А потом программист опрометчиво показывает эту программу подруге или ее начальнику, и вдруг количество функций в файле резко увеличивается для поддержки всех всплывающих новых «функций» и «требований». Первое правило «Клуба программ» — не говорить о «Клубе программ». Второе правило — минимизировать количество функций в одном файле.

Честно говоря, компилятору C совершенно все равно, если каждая функция в вашей программе находится в одном файле. Но мы не пишем программы для компьютеров или компиляторов; мы пишем их для других людей (которые иногда являются нами). Я знаю, что это, вероятно, сюрприз, но это правда.Программа воплощает в себе набор алгоритмов, которые решают задачу с помощью компьютера, и важно, чтобы люди понимали это, когда параметры задачи меняются непредвиденным образом. Людям придется изменить программу, и они будут проклинать ваше имя, если у вас есть все 2049 функций в одном файле.

Поэтому мы, хорошие и настоящие программисты, разбиваем функции, группируя похожие функции в отдельные файлы. Здесь у меня есть файлы main.c, mmencode.c и mmdecode.c. Для таких небольших программ это может показаться излишним. Но небольшие программы редко остаются маленькими, поэтому планировать расширение — это «хорошая идея».

А как насчет файлов .h? Я объясню их в общих чертах позже, но вкратце они называются файлами header и могут содержать определения типов языка C и директивы препроцессора C. Заголовочные файлы не должны не содержать никаких функций. Заголовки можно рассматривать как определение интерфейса прикладного программирования (API), предлагаемого файлом с расширением .c, который используется другими файлами .c.

Но что, черт возьми, такое Makefile?

Я знаю, что все вы, крутые ребята, используете интегрированную среду разработки "Ultra CodeShredder 3000" для написания следующего блокбастера, и создание вашего проекта состоит из смешивания Ctrl-Meta-Shift-Alt-Super-B. Но в мое время (и сегодня) много полезной работы выполнялось программами на C, созданными с помощью Makefiles. Makefile — это текстовый файл, содержащий рецепты работы с файлами, и программисты используют его для автоматизации сборки двоичных файлов своих программ из исходного кода (и других вещей тоже!).

Возьмем, к примеру, эту маленькую жемчужину:

Текст после октоторпа/фунта/решётки является комментарием, например, в строке 00.

Строка 01 — это присвоение переменной, где переменная TARGET принимает строковое значение my_sweet_program. По соглашению, да, я предпочитаю, все переменные Makefile пишутся с заглавной буквы и используют символы подчеркивания для разделения слов.

Строка 02 состоит из имени файла, который создает рецепт, и файлов, от которых он зависит. В данном случае цель — my_sweet_program, а зависимость — main.c.

Последняя строка, 03, имеет отступ с табуляцией, а не с четырьмя пробелами. Это команда, которая будет выполняться для создания цели. В этом случае мы вызываем cc внешний интерфейс компилятора C для компиляции и компоновки my_sweet_program.

Использовать Makefile очень просто:

Файл Makefile, который создаст наш кодировщик/декодер MeowMeow, значительно сложнее, чем в этом примере, но основная структура такая же. Я расскажу об этом в стиле Барни в другой статье.

Форма следует за функцией

Моя идея состоит в том, чтобы написать программу, которая читает файл, преобразует его и записывает преобразованные данные в другой файл. Следующее сфабрикованное взаимодействие с командной строкой — это то, как я представляю себе использование программы:

Нам нужно написать код для обработки командной строки и управления входными и выходными потоками. Нам нужна функция для кодирования потока и записи его в другой поток. И, наконец, нам нужна функция для декодирования потока и записи его в другой поток. Подождите секунду, я говорил только о написании одной программы, но в приведенном выше примере я вызываю две команды: мяу и немяу? Я знаю, вы, вероятно, думаете, что это чертовски сложно.

Незначительное отступление: argv[0] и команда ln

Если вы помните, сигнатура функции C main такова:

где argc — количество аргументов командной строки, а argv — список указателей на символы (строк). Значение argv[0] — это путь к файлу, содержащему исполняемую программу. Многие служебные программы Unix с дополнительными функциями (например, сжатие и распаковка) выглядят как две программы, но на самом деле это одна программа с двумя именами в файловой системе. Трюк с двумя именами достигается путем создания «ссылки» файловой системы с помощью команды ln.

Пример из /usr/bin на моем ноутбуке:

Здесь git и git-receive-pack — это один и тот же файл с разными именами. Мы можем сказать, что это один и тот же файл, потому что у них одинаковый номер инода (первый столбец). Индексный дескриптор — это функция файловой системы Unix, которая выходит за рамки этой статьи.

Хорошие и/или ленивые программисты могут использовать эту особенность файловой системы Unix, чтобы писать меньше кода, но вдвое больше программ, которые они создают. Во-первых, мы пишем программу, которая меняет свое поведение в зависимости от значения argv[0], затем обязательно создаем ссылки с именами, вызывающими такое поведение.

В нашем Makefile ссылка unmeow создается по следующему рецепту:

Я склонен параметризовать все в своих файлах Makefile, редко используя "голую" строку. Я группирую все определения в верхней части Makefile, что облегчает их поиск и изменение. Это имеет большое значение, когда вы пытаетесь перенести программное обеспечение на новую платформу и вам нужно изменить все свои правила, чтобы использовать xcc вместо cc.

Рецепт должен казаться относительно простым, за исключением двух встроенных переменных $@ и $

Рисование вручную слово

Как написать хорошую основную функцию C

Узнайте, как структурировать файл C и написать основную функцию C, которая обрабатывает аргументы командной строки, как чемпион.

Читайте также: