Я новичок в Ubuntu.
Если в оболочке я делаю:
touch file
Он создает файл в текущем каталоге, и если я открываю этот файл, он появляется как пустой текстовый файл. Также я могу сделать
echo "test" > file
cat file
И то, что я получаю - это строка.
Так пустой файл равен текстовому файлу?
Это создает файл в текущем каталоге, если я открываю этот файл, это появляется как пустой текстовый файл.
Если Вы работаете touch non_existing_filename
, это создаст пустой файл. Файл пуст, ничего не содержа. Это не означает, что это - текстовый файл или любой другой вид файла.
Если Вы работаете touch existing_file
, касание обновит метки времени на файле.
echo "test" > file
cat file
И то, что я получаю, является строкой. Таким образом, пустой файл равен текстовому файлу?
Да, если Вы запишете строку в пустой файл, то Вы получите строку при чтении содержания файла. Отметьте это >
перезаписи все содержание в файле и результат были бы тем же, если бы файл был пустым, несуществующим или некоторый другой файл (как изображение). Можно использовать >>
добавлять текст в файл.
Обратите внимание что инструменты, такие как перенаправление (>>
, >
и так далее), не заботьтесь о типе файла. Это - совершенно допустимая операция для добавления текстовой строки в файл, содержащий, например, изображение JPEG. Это - также совершенно допустимая операция к cat
некоторый файл изображения. Не то, чтобы я рекомендую попробовать; это не отобразится правильно на Вашем терминале.
Файловая система не имеет никакого понятия типов файлов. Это не заботится о том, какое содержание файл имеет - и нет никакого различия между различными типами файлов на уровне файловой системы.
Традиционно Unix намного менее зависит от типов файлов, чем Windows, и совершенно разумно назвать текстовый файл README
, пока в Windows было бы распространено иметь расширение .txt
для текстового файла.
Если Вы задаетесь вопросом, какой файл Вы имеете на руках, утилите file
довольно полезно:
$ file auth.log
auth.log: ASCII text
$ file Dokken.mp4
Dokken.mp4: ISO Media, MP4 Base Media v1 [IS0 14496-12:2003]
file
решает тип контента на основе описания общих характеристик каждого файла, обычно названного подписью файла. Например, debian будет всегда запускаться с байтов 21 3C 61 72 63 68 3E
, и если мы видим те байты в начале файла, у нас, вероятно, есть debian пакет на наших руках.
file
утилита использует так называемые волшебные файлы для решения, на какой тип файла это смотрит. Больше информации об этом может быть найдено в странице справочника для волшебства (например. man magic
в системе Linux).
Отметьте это file
весьма ненадежно, просто очень хороший индикатор. Если я создаю файл, который содержит байты ed ab ee db 0d 25
, файл определит это как /tmp/foobar: RPM v13.37 bin
. ed ab ee db
необходимый заголовок для файлов об/мин, и 0d 25
1337 в шестнадцатеричном числе... Этим файлом не будет допустимый RPM-пакет всегда.
При использовании касания к файлу, который не существует, оно создаст пустой файл для Вас. При использовании его на существующем файле, это обновит времена доступа и т.д. Проверьте тип файла с командой файла. Могут быть пустые двоичные файлы.
Для тех файлов file
утилита возвращает следующее:
$ touch new
$ file new
new: empty
Но для файла с некоторым текстом это возвратит "текст ASCII"
$ echo "text" > text
$ file text
text: ASCII text
Но некоторые графические приложения, такие как Pluma или Gedit откроют оба файла как текст.
Существует старая поговорка в Linux / Unix
Все - файл
После этих слов Linux определяет типы файлов волшебством, не обязательно содержанием
Посмотрите, Как Ubuntu знает, каков тип файла файл без расширения?
Пустой файл является просто пустым файлом - он не имеет никакого содержания, таким образом, это не текстовый файл. Можно заполнить пустой файл чем-либо, что Вы хотите (для создания этого текстовым файлом или двоичным файлом, или безотносительно другого типа файла, который Вы хотите). Вот простой тест:
Создайте пустой файл: $ touch somefile
Посмотрите, каков тип файла:
$ touch somefile
$ file somefile
$ somefile: empty
Добавьте некоторый текст к "somefile" и посмотрите, какой файл это:
$ echo "Some text..." >> somefile
$ file somefile
somefile: ASCII text
Создайте небольшой двоичный файл:
#include <iostream>
int main(int argc, char *argv[]) {
std::cout << "Hello, cruel world!" << std::endl;
return 0;
}
$ g++ test.cpp -o test
Удалите "somefile", коснитесь его снова, затем добавьте содержание двоичного файла к "somefile":
$ rm somefile
$ touch somefile
$ cat test >> somefile
$ file somefile
somefile: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=18c391d1f1bba8069fe85962458c7609bd8f516e, not stripped
TLDR: Нет. Текстовый файл не должен быть пустым, чтобы быть обнаруженным как таковой. Несомненно, это может быть пусто.
touch
устанавливает метку времени файла и создает файл, если это не существует. Так, какой файл является пустым файлом?
$ ls -l test
-rw-r--r-- 1 user users 0 1. Jän 18:36 test
$ file test
test: empty
file
утилита говорит это как отдельный тип файла. Это вызвано тем, что пустой файл мог быть чем-либо, что имеет смысл ко многим приложениям: Это может быть пустой файл простого текста, пустая таблица CSV, пустой поток необработанных данных (это не может быть пустой файл типа GZ, JPEG и т.д., потому что эти файлы не имеют 0 байтов, даже если приложения рассматривают их как пустых, поскольку они все содержат заголовки и другой материал). Так, тип не может быть немного лучше определен как пустой.
Короче говоря, пустой файл называют файлом нулевого байта. Этот файл не имеет никаких данных, ни даже просто заголовка, таким образом, Вы не можете сказать тип, хотя некоторые файловые менеджеры и другие программы могут рассматривать их как файл простого текста (это не истинный но хороший выбор рассматривать). Читайте больше отсюда.