Файлы в Linux

Содержание
Введение: Типы файлов в Linux
Семь типов файлов
-c character
-d directory
-b block
Узнать версию системы
Узнать расположение файла
Переместить файлы, но не директории
touch, >…: Создать один или несколько файлов
: >: Очистка файла
noclobber: Запрет перезаписи
rm: Удаление файла
stat: Информация о файле
Узнать количество строк
cat, echo: Объединение файлов
truncate: Создать файл определённого размера
Узнать кодировку файла
Изменить кодировку файла
chown: Изменить владельца файла
diff: Сравнить файлы
find: Поиск файлов
Обрезать mp3
Связанные статьи

Типы файлов в Linux

В Linux всё является файлами и tty терминалы не исключение.

Выполните

ls -l $(tty)

Или аналогичную команду

ls -l /dev/pts/1

crw--w----. 1 andrei tty 136, 1 Nov 19 12:43 /dev/pts/1

Первый символ - это тип файла.

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

- : regular file
d : directory
c : character device file
b : block device file
s : local socket file
p : named pipe
l : symbolic link

Тип c означает character. То есть этот файл может принимать и показывать символы

Если выполнить

ls -ld /etc

drwxr-xr-x. 118 root root 8192 Feb 09 03:16 /etc

Видно, что тип файла d. То есть directory

Для просмотра дисков/блоков выполните

lsblk

NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 8G 0 disk ├─sda1 8:1 0 1G 0 part /boot └─sda2 8:2 0 7G 0 part ├─centos-root 253:0 0 6.2G 0 lvm / └─centos-swap 253:1 0 820M 0 lvm [SWAP] sr0 11:0 1 57.7M 0 rom /run/media/andrei/VBox_GAs_6.1.10

Если выполнить

ls -l /dev/sda*

brw-rw----. 1 root disk 8, 0 Feb 09 03:16 /dev/sda brw-rw----. 1 root disk 8, 1 Feb 09 03:16 /dev/sda1 brw-rw----. 1 root disk 8, 2 Feb 09 03:16 /dev/sda2

Можно убедитсья, что тип файлов b. То есть block

? означает что должен быть один любой символ.

ls -l /dev/sda?

brw-rw----. 1 root disk 8, 1 Feb 09 03:16 /dev/sda1 brw-rw----. 1 root disk 8, 2 Feb 09 03:16 /dev/sda2

[12] означает что должен быть либо символ 1 либо символ 2

ls -l /dev/sda[12]

brw-rw----. 1 root disk 8, 1 Feb 09 03:16 /dev/sda1 brw-rw----. 1 root disk 8, 2 Feb 09 03:16 /dev/sda2

Когда вы хотите узнать версию системы вы можете выполнить

ls -l /etc/system-release

lrwxrwxrwx. 1 root root Feb 09 03:16 /etc/system-release -> centos-release

Тип файла l означает link то есть это не настоящий файл, а ссылка

Выполните

ls -l /etc/system-release /etc/centos-release /etc/redhat-release

-rw-r--r--. 1 root root 37 Oct 23 17:53 /etc/centos-release lrwxrwxrwx. 1 root root Feb 09 03:16 /etc/redhat-release -> centos-release lrwxrwxrwx. 1 root root Feb 09 03:16 /etc/system-release -> centos-release

/etc/centos-release - это настоящий (regular) файл а остальные - ссылки на него.

Если бы вы пользовались redhat то настоящим был бы redhat-release

Ещё один способ получить информацию о версии - выполнить lsb_release -d где -d означает description

lsb_release -d

Description: CentOS Linux release 7.9.2009 (Core)

Узнать расположение файла

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

ls -lF $(which lsb_release)

-rwxr-xr-x. 1 root root 15929 Mar 27 2015 /usr/bin/lsb_release*

Опция -F означает показать тип файлов. Поэтому нам удалось увидеть * после lsb_release. * означает, что файл исполняемый.

Чтобы узнать откуда взялся файл можно воспользоваться командой rpm с опциями q (query) и f (file)

rpm -qf $(which lsb_release)

redhat-lsb-core-4.1-27.el7.centos.1.x86_64

Чтобы скопировать файл в интерактивном режиме воспользуйтесь командой cp с опцией i (interactive)

interactive означает, что если файл с таким имененм существует, вас спросят прежде чем затирать его

cp -i /etc/hosts .
cp -i /etc/hosts .

cp: overwrite ‘./hosts’?

Чтобы создать директорию сразу же с поддиректорией внутри воспользуйтесь командлой mkdir с опцией p (parent)

mkdir -p sites/heiheiru
ls -l sites

total 0
drwxrwxr-x. 2 andrei andrei 6 Nov 19 13:40 heiheiru

Создать файл

touch newfile

Можно сделать это с помощью echo

echo "" newfile
echo -n newfile

Либо с помощью >, но этот вариант мне не нравится, так как на моей Ubuntu приходится делать CTRL + C

> newfile

Задать дату

touch -d '15 July 1975' newfile
stat newfile

File: newfile Size: 0 Blocks: 0 IO Block: 4096 regular empty file Device: fd00h/64768d Inode: 1851125 Links: 1 Access: (0644/-rw-r--r--) Uid: (26167/avorotyn) Gid: ( 2999/sshusers) Access: 1975-07-15 00:00:00.000000000 +0200 Modify: 1975-07-15 00:00:00.000000000 +0200 Change: 2022-06-15 10:05:27.686885410 +0300 Birth: -

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

Если файлов нужно немного - можно просто перечислить их через пробел

touch one two three

Чтобы создать одновременно несколько файлов с именами идущими по порядку выполните touch с {}

Этим способом можно создать много файлов одной короткой командой.

touch files/file{1..5}
ls -l files

-rw-rw-r--. 1 andrei andrei 0 Feb 09 03:16 file1 -rw-rw-r--. 1 andrei andrei 0 Feb 09 03:16 file2 -rw-rw-r--. 1 andrei andrei 0 Feb 09 03:16 file3 -rw-rw-r--. 1 andrei andrei 0 Feb 09 03:16 file4 -rw-rw-r--. 1 andrei andrei 0 Feb 09 03:16 file5

Чтобы скопировать директорию files в директорию sites со всем содержимым выполните

cp -R files sites
ls -l sites/files/

total 0 -rw-rw-r--. 1 andrei andrei 0 Feb 09 03:16 file1 -rw-rw-r--. 1 andrei andrei 0 Feb 09 03:16 file2 -rw-rw-r--. 1 andrei andrei 0 Feb 09 03:16 file3 -rw-rw-r--. 1 andrei andrei 0 Feb 09 03:16 file4 -rw-rw-r--. 1 andrei andrei 0 Feb 09 03:16 file5

Директория files была скопирована в директорию sites, то есть теперь у sites есть поддиректория files.

Если у вас установлена утилита tree вы можете наглядно изучить вложенность. Если нет - выполните сперва

sudo yum install tree

tree sites

sites └── files ├── file1 ├── file2 ├── file3 ├── file4 └── file5 1 directory, 5 files

Создать ссылку можно командой ln, символьную ссылку ln -s

Как очистить файл в linux

Чтобы удалить содержимое файла используйте

: > имя_файла

noclobber: Запрет перезаписи файла

С помощью noclobber можно запретить перезапись существующих файлов.

echo "ABC" > sample
cat sample

ABC

echo "DEF" > sample
cat sample

DEF

set -o noclobber
set -o | grep noclobber

noclobber on

echo "GHI" > sample

zsh: file exists: sample

Обойти запрет можно добавив | после >

echo "GHI" >| sample
cat sample

GHI

Отключить запрет на перезапись

set +o noclobber

Как удалить файл в linux

rm имя_файла

Информация о файле

Чтобы получить информацию о свойствах файла используйте команду stat

stat newfile

File: newfile Size: 0 Blocks: 0 IO Block: 4096 regular empty file Device: fd00h/64768d Inode: 1851125 Links: 1 Access: (0644/-rw-r--r--) Uid: (26167/avorotyn) Gid: ( 2999/sshusers) Access: 2022-06-15 09:53:28.402613374 +0300 Modify: 2022-06-15 09:53:28.402613374 +0300 Change: 2022-06-15 09:53:28.402613374 +0300 Birth: -

Узнать количество строк в файле linux

Чтобы подсчитать сколько всего строк в файле today.log используйте

wc -l today.log

282608 today.log

Объединение файлов

Для объединения файла one с файлом two достаточно выполнить

cat one two

Объединить можно сразу несклько файлов.

Рассмотрим три файла one , two , three следующего содержания

one

Cool bookstore:

two

Best hotels: Booking.com

three

Official Samsung Store: Samsung

Объединим их и проверим результат - он появится в консоли как и в случае двух файлов

cat one two three

Cool bookstore:
Best hotels: Booking.com
Official Samsung Store: Samsung

Теперь объедими файлы в один новый файл big

cat one two three > big
vi big

Cool bookstore: Best hotels: Booking.com Official Samsung Store: Samsung

К новому файлу big мы можем дописать в конец файл one

cat big one

Cool bookstore:
Best hotels: Booking.com
Official Samsung Store: Samsung
Cool bookstore:

echo

Те же действия можно выполнить с помощью команды echo

Создать файл определённого размера

Создадим файл 10M.txt размером в 10 Mb

truncate -s 10M /usr/share/10M.txt

Узнать кодировку файла

Предположим вы только что создали файл one.txt

touch one.txt

Чтобы узнать его кодировку выполните

file -i one.txt

one.txt: inode/x-empty; charset=binary

Напишите, что-то в файле и снова проверьте кодировку

echo heihei.ru < one.txt
file -i one.txt

one.txt: text/plain; charset=us-ascii

Убедитесь, что команда file -i опеределила разные кодировки binary и us-ascii

У вас может быть не us-ascii а другой вариант

Добавим в файл кириллические символы

echo добро << one.txt
file -i one.txt

one.txt: text/plain; charset=utf-8

Смена кодировки

Предположим у вас есть файл файл.html в неправильной кодировке.

Менять кодировку файлов можно следующим способом:

iconv options -f from-encoding -t to-encoding inputfile(s) -o outputfile

Пример:

cat файл.html | iconv -f cp1251 -t utf-8 > новый.html

В одну сторону. Потом открываем, редактируем, закрываем.

cat новый.html | iconv -f utf-8 -t cp1251 > файл.html

Конвертировать UTF-8 файл в SHIFT-JIS файл

iconv -f UTF-8 -t SHIFT-JIS utf-8-file > shift-jis-file
file -i shift-jis-file

shift-jis-file: text/plain; charset=unknown-8bit

touch sample echo "Привет" > sample file -i sample

sample: text/plain; charset=utf-8

iconv -f UTF-8 -t Windows-1251 sample > windows-1251-file
file -i windows-1251-file

windows-1251-file: text/plain; charset=iso-8859-1

Как вариант можно использовать convmv

Если у вас возникли проблемы с кодировкой на сайте советую прочитать статью «Сайт в неверной кодировке»

Изменить владельца файла

Допустим у вас есть файл one владельцами которого являются пользователь user и группа group

-rwx------. 1 user group 21012480 Dec 1 16:49 one

Чтобы изменить владельцев на andrei и heihei выполните

chown andrei:heihei one

-rwx------. 1 andrei heihei 21012480 Dec 1 16:49 one

Разделы про поиск и сравнение файлов теперь в отдельных статьях.

В статье /dev/urandom можно узнать о том как создать файл со случайным именем

Обрезать mp3

ffmpeg -i original.mp3 -vn -acodec copy -ss 00:00:00 -to 00:30:00 part_01.mp3