Как найти путь к файлу на линукс

1. Overview

Files and directories are building blocks of an operating system. As Linux users, we perform a variety of operations on the files and directories. One such operation is finding a full path of a file. The full path of a file is also known as its absolute or canonical path.

In this tutorial, we’ll discuss various ways to find the full path of a file.

2. Setup

Let’s create files and directories structure to use as an example:

$ cd /tmp
$ mkdir -p dir1/dir2/dir3/dir4/dir5
$ touch dir1/dir2/file2.txt
$ touch dir1/dir2/dir3/dir4/file4.txt
$ touch dir1/dir2/dir3/dir4/dir5/file5.txt

$ tree /tmp/dir1/
/tmp/dir1/
└── dir2
    ├── dir3
    │   └── dir4
    │       ├── dir5
    │       │   └── file5.txt
    │       └── file4.txt
    └── file2.txt

4 directories, 3 files

3. Using the readlink Command

The readlink command prints canonical file names. We can use the -f option of this command to find the full path of a file:

$ cd /tmp/dir1/dir2/dir3/dir4/dir5/
$ readlink -f file5.txt 
/tmp/dir1/dir2/dir3/dir4/dir5/file5.txt

4. Using the realpath Command

Alternatively, we can use the realpath command to get the absolute path of a file:

$ cd /tmp/dir1/dir2/dir3/dir4/
$ realpath file4.txt 
/tmp/dir1/dir2/dir3/dir4/file4.txt

5. Using the Combination of basename and dirname Commands

The basename command is useful when we want to strip the directory and suffix from filenames. Similarly, we can use the dirname command to strip the last component from the file name:

$ basename /tmp/dir1/dir2/dir3/dir4/file4.txt
file4.txt
$ dirname /tmp/dir1/dir2/dir3/dir4/file4.txt
/tmp/dir1/dir2/dir3/dir4

We can use the combination of these two commands to find the full path of a file. Let’s create a simple shell script for the same:

$ cat get_full_path.sh 
#! /bin/bash
echo "$(cd "$(dirname "$1")" && pwd -P)/$(basename "$1")"

$ chmod +x get_full_path.sh
$ ./get_full_path.sh file4.txt
/tmp/dir1/dir2/dir3/dir4/file4.txt

Firstly, we use the dirname command to find the directory in which a file is located. Then we change the directory using the cd command.

Next, we print the current working directory using the pwd command. Here, we have applied the -P option to show the physical location instead of the symbolic link.

Finally, we use the basename command to print the file name without a directory.

6. Using the find Command

The find command searches for files in a directory hierarchy. We can use this command to print the absolute path of a file:

$ cd /tmp/dir1/
$ find $PWD -type f -name file4.txt 
/tmp/dir1/dir2/dir3/dir4/file4.txt

7. Conclusion

In this article, we discussed various practical examples to find the absolute path of a file. First, we discussed the usage of the readlink and realpath commands. Then, we used a combination of the basename and dirname commands. Finally, we saw the example of the find command. We can use these commands in day-to-day life to boost our productivity.

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

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

Файловая система Linux очень сильно отличается от Windows. Мы не будем рассматривать ее структуру, это было сделано ранее. Мы сосредоточимся на работе с файлами.

Самое главное отличие, в том что адрес файла начинается не с диска, например, C: или D: как это происходит в Windows, а с корня, корневого системного каталога, к которому подключены все другие. Его адрес – /. И тут нужно сказать про адреса. Пути файлов linux используют прямой слеш “/” для разделения каталогов в адресе, и это отличается от того, что вы привыкли видеть в Windows – .

Например, если в Windows полный путь к файлу на рабочем столе выглядел C:UsersSergiyDesktop то в путь файла в linux будет просто /home/sergiy/desktop/. С этим пока все просто и понятно. Но проблемы возникают дальше.

В операционной системе Linux может быть несколько видов путей к файлу. Давайте рассмотрим какие бывают пути в linux:

  • Полный, абсолютный путь linux от корня файловой системы – этот путь вы уже видели в примере выше, он начинается от корня “/” и описывает весь путь к файлу;
  • Относительный путь linux – это путь к файлу относительно текущей папки, такие пути часто вызывают путаницу.
  • Путь относительно домашний папки текущего пользователя. – путь в файловой системе, только не от корня, а от папки текущего пользователя.

Рассмотрим теперь подробнее как выглядят эти пути в linux, а также разберем несколько примеров, чтобы было окончательно понятно. Для демонстрации будем пользоваться утилитой ls, которая предназначена для просмотра содержимого каталогов.

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

ls

dir

Вот так будет выглядеть полный путь linux к одному из файлов:

ls /home/sergiy/tmp/file1

dir1

Это уже относительный путь linux, который начинается от домашней папки, она обозначается ~/. Заметьте, не ~, а именно ~/. Дальше вы уже можете указывать подпапки, в нашем случае tmp:

ls ~/tmp/file1

dir2

Ну или путь файла в linux, относительно текущей папки:

ls file1

В каждой папке есть две скрытые ссылки, мы сможем их увидеть с помощью ls, выполнив ее с параметром -a:

ls -a

dir3

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

./file1

dir4

Это бесполезно при просмотре содержимого файла. Но очень важно при выполнении программы. Поскольку программа будет сначала искаться в среде PATH, а уже потом в этой папке. А потому, если нужно запустить программу, которая находится в текущей папке и она называется точно также как и та что в каталоге /bin, то без явной ссылки что файл нужно искать в текущей папке ничего не получится.

Вторая ссылка вам позволяет получить доступ к файлам в папке выше текущей. Например:

ls ../tmp/file1

dir5

Такие конструкции могут довольно часто встречаться при компиляции программ. Все эти символы и пути файлов linux вы можете применять не только в терминале, но и в любом файловом менеджере, что может быть очень удобно.

Но терминал Linux предоставляет еще более широкие возможности. Вы можете использовать простые символы замены прямо в адресах файлов или каталогов. Например, можно вывести все файлы, начинающиеся на f:

ls ./f*

dir6

dir7

Или даже можно искать не только в папке tmp, а в любой подпапке домашней папки:

ls ~/*/f*

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

Выводы

Вот и все. Теперь вы знаете все что необходимо, чтобы не только правильно написать путь к файлу linux, но и выполнять более сложные действия, например, поиск файлов или навигация по каталогам с помощью команды cd. Если у вас остались вопросы, спрашивайте в комментариях!

Обнаружили ошибку в тексте? Сообщите мне об этом. Выделите текст с ошибкой и нажмите Ctrl+Enter.

Creative Commons License

Статья распространяется под лицензией Creative Commons ShareAlike 4.0 при копировании материала ссылка на источник обязательна .

Об авторе

Основатель и администратор сайта losst.ru, увлекаюсь открытым программным обеспечением и операционной системой Linux. В качестве основной ОС сейчас использую Ubuntu. Кроме Linux, интересуюсь всем, что связано с информационными технологиями и современной наукой.

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

Как узнать, в какой директории вы находитесь

Первая команда, которую мы изучим — pwd, сокращение от Print Working Directory (выведи рабочую директорию). Вы скоро увидите, что множество команд в Linux — это аббревиатуры слов, описывающих их. Это помогает лучше их запомнить. Собственно, команда и выводит текущую рабочую директорию. Попробуйте использовать ее.

1. pwd
2. /home/karpaff

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

Как узнать содержимое директории

Мы научились определять, в какой директории мы находимся. Теперь давайте научимся узнавать содержимое директории. В этом нам поможет команда ls — сокращение от list (список). Давайте опробуем ее.

1. ls
2. bin Documents public_html

Команда pwd отрабатывает сама по себе, без аргументов. ls в этом плане посильнее. В случае выше мы запустили ее без аргументов — она выведет список содержимого данной директории. Но от ls можно получить больше — ниже дана схема ее использования:

ls [ключи] [директория]

В примере выше квадратные скобки обозначают, что эти пункты опциональны, и мы можем запускать команду и с ними, и без них. Ниже я запустил разные варианты ls, чтобы продемонстрировать ее работу.

1. [email protected]: ls
2. bin Documents public_html
3. [email protected]:
4. [email protected]: ls -l
5. total 3
6. drwxr-xr-x  2 karpaff users 4096 Mar 23 13:34 bin
7. drwxr-xr-x 18 kapraff users 4096 Feb 17 09:12 Documents
8. drwxr-xr-x  2 karpaff users 4096 May 05 17:25 public_html
9. [email protected]:
10. [email protected]: ls /etc
11. a2ps.cfg aliases alsa.d cups fonts my.conf systemd
12. ...
13. [email protected]: ls -l /etc
14. total 3
15. -rwxr-xr-x  2 root root 123 Mar 23 13:34 a2ps.cfg
16. -rwxr-xr-x 18 root root 78 Feb 17 09:12 aliases
17. drwxr-xr-x  2 karpaff users 4096 May 05 17:25 alsa.d
18. ...
19. [email protected]:

Рассмотрим код по частям:

  • Строка 1 — запуск ls в базовой форме. Она вывела список содержимого текущей директории.
  • Строка 4 — запуск ls с ключом -l, который означает, что команда выведет длинный список. В длинном списке есть следующее:
    • Первый символ означает, является ли объект файлом - или директорией d.
    • Следующие 9 символов — типы разрешений для файла или директории.
    • Следующее поле — количество блоков (пока что не задумывайтесь об этом).
    • Дальше — владелец файла или директории (в данном случае — karpaff)
    • Дальше — группа, которой принадлежит файл или директория (в данном случае — users).
    • Следующая часть — размер файла/директории.
    • Затем идет время изменения.
    • И в конце — название файла или директории.
  • Строка 10 — запуск ls с аргументом командной строки /etc. Когда мы так делаем, ls выводит содержимое не рабочей директории, а той, которую мы передали в качестве аргумента.
  • Строка 13 — запуск ls и с ключом, и с аргументом командной строки. Соответственно, здесь был произведен вывод длинного списка директории /etc.
  • Строки 12 и 18 означают лишь, что для краткости я вырезал стандартный вывод некоторых команд. При запуске команд вы увидите более длинный список файлов и директорий.

Пути к файлам

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

Абсолютные и относительные пути

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

Для начала нужно понять, что файловая система под Линуксом — это иерархическая структура. Наверху этой структуры находится корневая директория. Она обозначается одним слэшем /. У нее есть свои поддиректории, у них свои и так далее. Файлы могут находиться в любой из директорий.

Абсолютные пути указывают положение файла или директории относительно директории root. Их можно узнать по слэшу в начале пути /.

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

Пример:
1. [email protected]: pwd
2. /home/karpaff
3. [email protected]:
4. [email protected]: ls Documents
5. file1.txt file2.txt file3.txt
6. ...
7. [email protected]: ls /home/karpaff/Documents
8. file1.txt file2.txt file3.txt
9. ...
  • Строка 1 — запускаем pwd, чтобы узнать, где мы находимся.
  • Строка 4 — запускаем ls с аргументом в виде относительного пути. Documents — директория в той папке, в которой мы сейчас находимся. Такая команда может выдать разный результат в зависимости от того, где мы находимся. Если бы у нас был другой пользователь в системе, скажем, Вася, и мы запустили бы эту команду в его домашней директории, выводом стало бы содержимое папки Documents Васи.
  • Строка 7 — запускаем ls с аргументом в виде абсолютного пути. Вывод такой команды будет одинаков вне зависимости от того, где мы сейчас находимся.

Скоро вы увидите, что множество вещей в Linux можно получить несколькими разными способами. Пути — не исключение. Ниже приведены некоторые иные компоненты для построения путей. 

  • ~ (тильда) — обозначение вашей домашней директории. Например, если ваша домашняя директория /home/karpaff, то к директории Documents можно обратиться по пути /home/karpaff/Documents или по пути ~/Documents.
  • . (точка) — указание на директорию, где вы сейчас находитесь. Например, в примере выше на 4 строке мы обратились к директории Documents с помощью относительного пути. Тот путь можно было записать как ./Documents (Обычно в этом нет необходимости, но ниже мы рассмотрим примеры того, где это может пригодиться).
  • .. (две точки) — указание на родительскую директорию. Вы можете использовать такое сокращение в пути несколько раз, чтобы подниматься по иерархии. Например, если вы были в папке /home/karpaff, вы можете запустить команду ls ../../ и выводом будет список содержимого корневой директории.

Теперь вы знаете, что к местоположению можно обращаться множеством разных способов. Некоторые из вас зададутся вопросом, какой вариант лучше использовать? Ответ: любой, который больше нравится. Обращаетесь вы к файлу или директории, в командной строке вы обращаетесь по пути, а путь вы можете составить, используя любой из элементов, представленных выше. Лучший подход в этом деле — удобный именно для вас.

Примеры:
1. [email protected]: pwd
2. /home/karpaff
3. [email protected]:
4. [email protected]: ls ~/Documents
5. file1.txt file2.txt file3.txt
6. ...
7. [email protected]: ls ./Documents
8. file1.txt file2.txt file3.txt
9. ...
10. [email protected]: ls /home/ryan/Documents
11. file1.txt file2.txt file3.txt
12. ...
13. [email protected]:
14. [email protected]: ls ../../
15. bin boot dev etc home lib var
16. ...
17. [email protected]:
18. [email protected]: ls /
19. bin boot dev etc home lib var
20. ...

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

Как сменить директорию

Для передвижения по системе используется команда cd, сокращение от change directory (сменить директорию). Она работает следующим образом:

cd [местоположение]

Подсказка: если вы запустите команду без аргументов, она вернет вас в домашнюю директорию.

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

Пример:
1. [email protected]: pwd
2. /home/karpaff
3. [email protected]: cd Documents
4. [email protected]: ls
5. file1.txt file2.txt file3.txt
6. ...
7. [email protected]: cd /
8. [email protected]: pwd
9. /
10. [email protected]: ls
11. bin boot dev etc home lib var
12. ...
13. [email protected]: cd ~/Documents
14. [email protected]: pwd
15. /home/karpaff/Documents
16. [email protected]: cd ../../
17. [email protected]: pwd
18. /home
19. [email protected]: cd
20. [email protected]: pwd
21. /home/karpaff

Автодополнение

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

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

Это сложно продемонстрировать в статье, так что попробуйте потестировать эту фичу сами. Если вы напечатаете в командной строке cd /hTab/<начало вашего имени пользователя>Tab, вы поймете, как это работает.

Что нужно запомнить

Команды

pwd
Выводит текущую директорию.

ls
Выводит писок содержимого директории.

cd
Переводит в другую директорию.

Понятия

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

Абсолютный путь
Местоположение файла или директории относительно корневой папки файловой системы.

Практические задания

Давайте применим то, что мы только что узнали, на практике. Попробуйте выполнить следующие задания:

1. Начнем с передвижения по системе. Используйте команды cd и ls, чтобы больше узнать о директориях вашей системы и о том, что в них есть. Постарайтесь использовать разные варианты относительных и абсолютных путей. Интересные места для исследования:

/etc — здесь хранятся конфигурационные файлы системы.
/var/log — здесь хранятся файлы логов для разных системных программ. (У вас может не быть разрешений просматривать все в этой директории. Пусть это вас не останавливает. Пара сообщений об ошибках никому не помешает)
/bin — место, в котором хранятся некоторые часто используемые программы.
/usr/bin — еще одно место, в котором хранятся системные программы.

2. А теперь вернитесь в домашнюю директорию 4 разными способами.

3. Постарайтесь почаще использовать автодополнение. Зачем напрягаться, если компьютер может что-то делать за вас?

Время на прочтение
5 мин

Количество просмотров 123K

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

Команда find – это невероятно мощный инструмент, позволяющий искать файлы не только по названию, но и по:

  • Дате добавления.
  • Содержимому.
  • Регулярным выражениям.

Данная команда будет очень полезна системным администраторам для:

  • Управления дисковым пространством.
  • Бэкапа.
  • Различных операций с файлами.

Команда find в Linux производит поиск файлов и папок на основе заданных вами критериев и позволяет выполнять действия с результатами поиска.

Синтаксис команды find:

$ find directory-to-search criteria action

Где:

  • directory-to-search (каталог поиска) – это отправной каталог, с которой find начинает поиск файлов по всем подкаталогам, которые находятся внутри. Если не указать путь, тогда поиск начнется в текущем каталоге;
  • criteria (критерий) – критерий, по которым нужно искать файлы;
  • action (действие) – что делать с каждым найденным файлом, соответствующим критериям.

Поиск по имени

Следующая команда ищет файл s.txt в текущем каталоге:

$ find . -name "s.txt"
./s.txt

Где:

  • . (точка) – файл относится к нынешнему каталогу
  • -name – критерии по которым осуществляется поиск. В данном случае поиск по названию файла.

В данном случае критерий -name учитывает только символы нижнего регистра и файл S.txt не появиться в результатах поиска. Чтобы убрать чувствительность к регистру необходимо использовать –iname.

$ find . -iname "s.txt"
./s.txt
./S.txt

Для поиска всех изображений c расширением .png нужно использовать шаблон подстановки *.png:

$ find . -name "*.png"
./babutafb.png
./babutafacebook.png
./Moodle2.png
./moodle.png
./moodle/moodle1.png
./genxfacebook.png

Можно использовать название каталога для поиска. Например, чтобы с помощью команды find найти все png изображения в каталоге home:

$ find /home -name "*.png"
find: `/home/babuta/.ssh': Permission denied
/home/vagrant/Moodle2.png
/home/vagrant/moodle.png
/home/tisha/hello.png
find: `/home/tisha/testfiles': Permission denied
find: `/home/tisha/data': Permission denied
/home/tisha/water.png
find: `/home/tisha/.cache': Permission denied

Если выдает слишком много ошибок в отказе разрешения, тогда можно добавить в конец команды – 2> /dev/null. Таким образом сообщения об ошибках будут перенаправляться по пути dev/null, что обеспечит более чистую выдачу.

find /home -name "*.jpg" 2>/dev/null
/home/vagrant/Moodle2.jpg
/home/vagrant/moodle.jpg
/home/tisha/hello.jpg
/home/tisha/water.jpg

Поиск по типу файла

Критерий -type позволяет искать файлы по типу, которые бывают следующих видов:

  • f – простые файлы;
  • d – каталоги;
  • l – символические ссылки;
  • b – блочные устройства (dev);
  • c – символьные устройства (dev);
  • p – именованные каналы;
  • s – сокеты;

Например, указав критерий -type d будут перечислены только каталоги:

$ find . -type d
.
./.ssh
./.cache
./moodle

Поиск по размеру файла

Допустим, что вам необходимо найти все большие файлы. Для таких ситуаций подойдет критерий -size.

  • “+” — Поиск файлов больше заданного размера
  • “-” — Поиск файлов меньше заданного размера
  • Отсутствие знака означает, что размер файлов в поиске должен полностью совпадать.

В данном случае поиск выведет все файлы более 1 Гб (+1G).

$ find . -size +1G
./Microsoft_Office_16.29.19090802_Installer.pkg
./android-studio-ide-183.5692245-mac.dmg

Единицы измерения файлов:

  • c — Байт
  • k — Кбайт
  • M — Мбайт
  • G — Гбайт

Поиск пустых файлов и каталогов

Критерий -empty позволяет найти пустые файлы и каталоги.

$ find . -empty
./.cloud-locale-test.skip
./datafiles
./b.txt
...
./.cache/motd.legal-displayed

Поиск времени изменения

Критерий -cmin позволяет искать файлы и каталоги по времени изменения. Для поиска всех файлов, измененных за последний час (менее 60 мин), нужно использовать -60:

$ find . -cmin -60
.
./a.txt
./datafiles

Таким образом можно найти все файлы в текущем каталоге, которые были созданы или изменены в течение часа (менее 60 минут).

Для поиска файлов, которые наоборот были изменены в любое время кроме последнего часа необходимо использовать +60.

$ find . -cmin +60

Поиск по времени доступа

Критерий -atime позволяет искать файлы по времени последнего доступа.

$ find . -atime +180

Таким образом можно найти файлы, к которым не обращались последние полгода (180 дней).

Поиск по имени пользователя

Опция –user username дает возможность поиска всех файлов и каталогов, принадлежащих конкретному пользователю:

$ find /home -user tisha 2>/dev/null

Таким образом можно найти все файлы пользователя tisha в каталоге home, а 2>/dev/null сделает выдачу чистой без ошибок в отказе доступа.

Поиск по набору разрешений

Критерий -perm – ищет файлы по определенному набору разрешений.

$ find /home -perm 777

Поиск файлов с разрешениями 777.

Операторы

Для объединения нескольких критериев в одну команду поиска можно применять операторы:

  • -and
  • -or
  • -not

Например, чтобы найти файлы размером более 1 Гбайта пользователя tisha необходимо ввести следующую команду:

$ find /home  -user tisha  -and  -size +1G  2>/dev/null

Если файлы могут принадлежать не только пользователю tisha, но и пользователю pokeristo, а также быть размером более 1 Гбайта.

$ find /home ( -user pokeristo -or -user tisha )  -and  -size +1G  2>/dev/null

Перед скобками нужно поставить обратный слеш “”.

Действия

К команде find можно добавить действия, которые будут произведены с результатами поиска.

  • -delete — Удаляет соответствующие результатам поиска файлы
  • -ls — Вывод более подробных результатов поиска с:
    • Размерами файлов.
    • Количеством inode.
  • -print Стоит по умолчанию, если не указать другое действие. Показывает полный путь к найденным файлам.
  • -exec Выполняет указанную команду в каждой строке результатов поиска.

-delete

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

$ find . -empty -delete

Перед удалением лучше лишний раз себя подстраховать. Для этого можно запустить команду с действием по умолчанию -print.

-exec:

Данное действие является особенным и позволяет выполнить команду по вашему усмотрению в результатах поиска.

-exec command {} ;

Где:

  • command – это команда, которую вы желаете выполнить для результатов поиска. Например:
    • rm
    • mv
    • cp
  • {} – является результатами поиска.
  • ; — Команда заканчивается точкой с запятой после обратного слеша.

С помощью –exec можно написать альтернативу команде –delete и применить ее к результатам поиска:

$ find . -empty -exec rm {} ;

Другой пример использования действия -exec:

$ find . -name "*.jpg" -exec cp {} /backups/fotos ;

Таким образом можно скопировать все .jpg изображения в каталог backups/fotos

Заключение

Команду find можно использовать для поиска:

  • Файлов по имени.
  • Дате последнего доступа.
  • Дате последнего изменения.
  • Имени пользователя (владельца файла).
  • Имени группы.
  • Размеру.
  • Разрешению.
  • Другим критериям.

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

  • Удаление.
  • Копирование.
  • Перемещение в другой каталог.

Команда find может сильно облегчить жизнь системному администратору, а лучший способ овладеть ей – больше практиковаться.

image

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

  • Навигация
  • Поиск
  • Работа с папками
  • Работа с файлами
  • Переименование, перемещение и копирование

Навигация

После подключения к серверу вы оказываетесь в домашней папке пользователя. Чтобы узнать точный путь к вашему текущему местонахождению, воспользуйтесь командой:

pwd

Она выведет текущую рабочую директорию (print working directory). 

Если вам нужно перейти в другую папку, для этого используется команда cd (change directory) с указанием пути к нужной вам папке:

cd /home

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

/ корневая папка сервера
.

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

find . -name hello.txt
..

директория, расположенная на уровень выше текущей. Если вы находитесь в папке /home/user, то комбинация .. будет обозначать папку /home. То есть, чтобы вернуться на один уровень назад, необязательно вводить весь путь: 

cd ..
~

домашняя папка текущего пользователя. Например, запустить скрипт some-script.sh из домашней папки, когда вы находитесь в другой директории, можно так:

sh ~/some-script.sh

предыдущая посещённая директория. Представим, что вы перешли в папку /home, потом вам потребовалось изменить настройки в папке /etc. Чтобы вернуться назад, достаточно использовать команду: 

cd -

Для навигации с помощью команды cd есть два формата указания пути к нужной папке: абсолютный и относительный.

Абсолютный путь — это полный путь от корневой папки сервера «/». Например, вот такой: 

/var/www/data/username/data/www/example.com/

Также к абсолютным относятся пути, в которых используется ~ — указание на домашнюю папку текущего пользователя. Например, при доступе к файлу ~/.bash_profile он всегда будет открываться из одного и того же места: вместо ~ будет использоваться значение переменной окружения $HOME, которое не меняется.

Относительный путь — это неполный путь. Он указывается относительно какого-то объекта: например,  текущей рабочей директории. То есть в начале отсутствует символ корневой папки «/».

./docs/files/file.txt

file.txt

Представим, что мы сейчас работаем с файлами в папке /var/www/data/username. Нам нужно отредактировать содержимое в директории на уровень выше — /var/www/data. Чтобы управлять данными в этой папке, нам не обязательно постоянно указывать полный путь к ним — можно работать с относительным, начиная его с «../»

Также относительные пути используются, когда нужно выполнить операцию над файлом или папкой в директории, в которой мы сейчас работаем. Для выполнения команды достаточно указать имя файла или папки — система поймёт, что мы имеем в виду файл из текущего каталога.

Чтобы отобразить список содержимого папки, можно использовать команду ls (list). Если дополнить её ключами -al, она покажет типы данных, разрешения и скрытые файлы. Следующий пример покажет названия файлов и папок текущей рабочей папки:

ls

А этот выведет в терминал подробный список содержимого папки /etc:

ls -al /etc

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

  • Ubuntu и Debian:

    apt -y install mc
    
  • CentOS:

    yum -y install mc

Его особенность — примитивный графический интерфейс. Он позволяет быстро ориентироваться в структуре каталогов, перемещаться между ними, создавать новые директории. Интерфейс разбит на два окна, между которыми вы можете перемещать файлы и папки. Помимо прочего, в нём можно работать и с помощью мыши — перемещаться двойным кликом по папкам, использовать кнопки в нижней части панели. 

Поиск

С помощью команды find можно найти на сервере папку или файл по набору условий. Структура команды проста: 

find [где искать] [как искать] [что искать]

Например, мы знаем название файла hello.txt, но не знаем, где именно на сервере он лежит. Найти его поможет конструкция:

find / -name "hello.txt"
  • / указывает, что искать надо, начиная с корневой папки сервера. Если вам известно, где может лежать искомый файл, можно задать путь точнее.
  • -name указывает, что искать надо строго по имени.
  • "hello.txt" — имя файла, который нам нужно найти. Если известна только часть имени, можно указать сокращённый вариант: "hello*", "*.txt"

Кроме -name, команда find имеет множество опций, которые позволяют уточнить условия поиска подробнее. Вот список наиболее полезных параметров:

-type

Позволяет указать тип искомых данных: -type f — файлы, -type d — директории

-perm

Позволяет вывести файлы с определённым уровнем доступа. Например, –perm 777

-empty

Отображает только пустые файлы или папки

-user

Позволяет искать данные среди файлов, принадлежащих конкретному пользователю: -user root

-group

Позволяет искать данные среди файлов, принадлежащих определённой группе пользователей: -group www-data

-mtime

Позволяет задать условие относительно времени изменения файлов:

  • -mtime 7 — файлы, менявшиеся в течение последних 7 дней;
  • -mtime +7 — файлы, менявшиеся в срок более чем 7 дней назад;
  • -mtime -14 — файлы, менявшиеся в срок менее чем 14 дней назад.

-atime

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

-size

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

-exec COMMAND {}

Позволяет применить к найденным файлам команду COMMAND

Больше информации о возможностях find можно узнать в файлах документации:

man find

Из встроенных инструментов поиска можно также отметить утилиту whereis. Она предназначена для поиска бинарных и системных файлов и директорий служб.  Следующий пример выведет список всех файлов и папок, имеющих прямое отношение к php:

whereis php

Работа с папками

Для создания новых директорий используется команда mkdir с указанием пути до создаваемой папки. Пример ниже создаст папку /new в существующей директории /home/user:

mkdir /home/user/new

Если нужно создать сразу несколько вложенных папок, можно использовать параметр -p. В таком случае все несуществующие директории, указанные в пути, будут созданы автоматически. Представим, что нам нужно создать вложенные папки docs/photos/2020-08-17 в текущей директории — это будет выглядеть так:

mkdir -p docs/photos/2020-08-17

Если нужно создать несколько папок за раз, можно просто перечислить их через пробел:

mkdir docs pictures games

Удалить папку можно с помощью команды rmdir с указанием пути. Папка будет удалена только в случае, если она пуста (можно использовать параметр --ignore-fail-on-non-empty, чтобы удалить папку в любом случае). Для удаления нескольких вложенных папок можно аналогично использовать параметр -p. Пример ниже удалит папку /photos и все каталоги внутри неё: 

rmdir -p docs/photos

Для удаления есть более эффективный инструмент, rm, про который расскажем ниже.

Работа с файлами

Создание

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

Самый простой, одновременно создающий и файл, и недостающие папки — команда touch. Достаточно передать ей полный путь к файлу. Для примера создадим в папке docs папку copies, а внутри неё — файл copies-list.txt:

touch docs/copies/copies-list.txt

Несуществующая папка copies создастся автоматически.

Если нужно создать сразу несколько файлов, можно просто перечислить их через пробел: 

touch file1.txt file2.txt file3.txt

Ещё один способ создания новых файлов — вызвать какой-нибудь консольный текстовый редактор с указанием полного пути к файлу. Однако все папки придётся создать заранее. Тогда редактор автоматически создаст файл и откроет его для редактирования. Если не сохранить файл в редакторе, даже пустой, он не будет создан. Команда ниже добавит новый файл с помощью редактора vi:

vi new-file.txt

Для сохранения и выхода из файла в vi нужно нажать клавишу Esc, ввести сочетание :wq и нажать Enter. Для выхода без сохранения нужно также нажать Esc, ввести сочетание :q! и нажать Enter.

Ещё пара способов создания пустых файлов: 

cat > new-file.txt

echo > new-file.txt

Редактирование

Для редактирования файлов используются консольные текстовые редакторы. Самые известные — vi и nano. В некоторых дистрибутивах vi заменён на vim (vi improved, улучшенный vi) или vim.tiny

Редактор vi будет доступен вам по умолчанию на большинстве Linux-систем.

А теперь к делу. Vi (более известен как Vim) — старый, очень гибкий и при этом не очень простой в плане управления редактор. Собственно, так он и попал в популярные программистские и админские шуточки. 

Запуск редактора без аргументов откроет его в режиме справки: 

vi

Чтобы закрыть Vim (без сохранения), введите сочетание :q!

Если указать редактору путь к файлу, он откроет его для редактирования. Если файл не существовал, он будет создан:

vi new-file.txt

При первом входе Vim открывает файл в режиме просмотра. Он не позволяет редактировать его содержимое, но можно вводить командные последовательности, перемещаться по тексту, выполнять поиск и пр.

Чтобы начать ввод, нужно перейти в режим редактирования с помощью клавиши I. Чтобы вернуться в режим просмотра, нажмите Esc.

Перемещение по тексту выполняется с клавиатуры:

  • перемещение в начало текста: Esc + дважды G
  • перемещение в конец текста: Shift + G
  • перемещение по строке горизонтально: стрелки
  • перемещение по строкам вертикально: стрелки
  • отображение номеров строк: Esc, введите :set number, нажмите Enter
  • перемещение по номерам строк: Esc, введите : номер строки, нажмите Enter

Для выхода с сохранением файла нажмите Esc и введите :wq!

Текстовый редактор vim — краткое руководство

Более современной и удобной альтернативой Vim считается редактор nano. Современные дистрибутивы включают его по умолчанию, но на ранних версиях устанавливать придётся вручную: 

  • Ubuntu и Debian:

    apt -y install nano
  • CentOS:

    yum -y install nano

Вызов nano без аргументов откроет пустой редактор. Можно начать ввод (при сохранении вам будет предложено указать имя и сохранить файл) или вызвать режим помощи со списком доступных команд с помощью сочетания Ctrl+G.

Для сохранения файла нажмите Ctrl+O — редактор предложит ввести имя файла: введите имя и нажмите Enter. Если файл существовал, и имя изменять не требуется, просто нажмите Enter.

Для выхода из редактора нажмите Ctrl+X.

Чтение

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

Команда cat позволяет вывести в терминал всё содержимое файла, который указан в качестве аргумента: 

cat example.txt

Однако, если мы заведомо знаем, что в файле большой объём информации, нет смысла выводить его целиком. Например, команды head и tail могут вывести часть содержимого с начала или конца файла соответственно. Если добавить к ним ключ -n, можно уточнить, сколько строк текста нужно вывести:

head -n 3 example.txt

tail -n 3 example.txt

Помимо прочего, команда tail очень удобна для чтения логов с ключом -f. В таком режиме она открывает файл в режиме ожидания и выводит все добавляемые данные. Пригодится для тестирования или дебаггинга.

Иногда нам всё-таки нужно полностью просмотреть файл. При этом читать его вывод в терминале неудобно. На такие случаи есть команда less — она открывает файл (или переданный в неё вывод другой команды) в режиме чтения: 

less example.com

В режиме чтения less можно перемещаться, искать текст и многое другое. Все командные последовательности и горячие клавиши можно вывести с помощью параметра --help:

less --help

Для выхода из режима чтения введите q и нажмите Enter.

Удаление

Для удаления файлов используется команда rm. Она крайне опасна — неправильное применение грозит удалением всего содержимого сервера. Поэтому, как говорится, семь раз отмерь, один раз отрежь: категорически важно перепроверять путь, который вы указываете для удаления.

Самая простая версия rm удалит файл с предварительным подтверждением — для этого потребуется ввести y и нажать Enter:

rm new-file.txt

Для полного же уничтожения всего и вся к команде добавляются параметры -rf. Первый отвечает за рекурсивное удаление данных (т.е. удаление вложенных файлов и папок), второй позволяет отключить подтверждение при удалении. Например, следующая команда удалит папку photos, размещённую в папке docs, и всё её содержимое:

rm -rf docs/photos

Для шуток над неопытными администраторами им под тем или иным предлогом предлагают выполнить команду rm -rf [/] (без квадратных скобок). Она удаляет всё содержимое сервера от корня. Результат — все данные безвозвратно теряются, а сервер перестаёт работать. 

Скачивание и загрузка

Для передачи файлов на сервер и с сервера есть много способов. Самые простые — использование wget, curl или scp.

  1. wget позволяет скачивать данные на сервер. Он поддерживает HTTP, HTTPS и FTP протоколы.

    wget [как скачать] [откуда скачать]

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

    wget https://ru.wordpress.org/latest-ru_RU.tar.gz

    С помощью параметра -P можно указать путь, куда нужно сохранить скачиваемый файл:

    wget -P /var/www/example.com https://ru.wordpress.org/latest-ru_RU.tar.gz

    Полный список параметров wget можно посмотреть в справочной информации: 

    man wget
  2. curl используется как для скачивания файлов на ваш сервер, так и для передачи данных с него на другие серверы / хранилища. Он универсальнее wget благодаря огромному количеству поддерживаемых протоколов: FTP, HTTP, HTTPS, IMAP, POP3, SCP, SFTP, SMB,  SMTP, Telnet и др.

    curl [как скачать] [откуда скачать / куда загрузить]

    В современных дистрибутивах curl установлен по умолчанию. При необходимости установить его вручную можно следующим образом: 

    • Ubuntu и Debian:
      apt -y install curl
    • CentOS:
      yum -y install curl

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

    curl -O https://ru.wordpress.org/latest-ru_RU.tar.gz

    В примере мы скачиваем архив latest-ru_RU.tar.gz по ссылке и сохраняем его в текущую рабочую директорию с таким же именем — за это отвечает ключ -O. Если использовать опцию -o, можно задать своё имя (wp.tar.gz) для сохраняемого файла: 

    curl -o wp.tar.gz https://ru.wordpress.org/latest-ru_RU.tar.gz

    Если нам нужно загрузить файл c нашего сервера на другой, используется следующая конструкция:

    curl -T filename.txt https://example.com/downloads/filename.txt

    Здесь файл filename.txt из текущей рабочей директории загружается на сайт example.com в папку downloads/ и сохраняется с именем filename.txt. Пример подразумевает, что у нас есть права на запись в указанный каталог.

    Остальные возможности curl можно узнать в справочной информации: 

    man curl
  3. Утилита scp позволяет копировать файлы между двумя серверами, используя протокол SSH. 

    scp [где взять файлы] [куда их загрузить]

    Например, для передачи файла filename.txt с нашего сервера на удалённый сервер 1.2.3.4 в папку new-documents пользователя username можно использовать следующую команду:

    scp ~/documents/filename.txt username@1.2.3.4:/home/username/new-documents

    В процессе система запросит у нас пароль пользователя username для подключения к удалённому серверу. После авторизации файл будет скопирован на целевой сервер в указанную папку.

    Чтобы скачать файл с удалённого сервера, достаточно немного видоизменить нашу команду: 

    scp username@1.2.3.4:/home/username/documents/filename.txt ~/new-documents/

    Здесь мы в качестве источника для получения копии файла указали удалённый сервер, а в качестве цели для загрузки копии — папку на текущем сервере. 

    С помощью scp аналогичным образом можно копировать данные между двумя удалёнными серверами:

    scp username1@1.2.3.4:/home/username1/documents/filename.txt username2@2.3.4.5:/home/username2/new-documents

Запуск исполняемых bash-скриптов

Чтобы запустить скрипт script.sh на сервере, нужно выполнить два шага: 

  1. Настроить права на запуск файла для пользователей:

    chmod +x ./script.sh
  2. Запустить скрипт. Если вы находитесь в той же директории, где лежит скрипт, достаточно вызвать его по имени: 

    ./script.sh

    В некоторых случаях нужно использовать команду sh либо указать путь к исполняемому файлу командной оболочки:

    sh ./script.sh

    либо 

    /bin/bash ./script.sh

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

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

Весь список существующих алиасов системы можно вывести с помощью команды alias:

Создать свой постоянный алиас можно с помощью файла .bashrc, размещённого в домашнем каталоге вашего пользователя. Нужно открыть его для редактирования:

vi ~/.bashrc

В соответствующем разделе нужно добавить ваш алиас в следующем формате:

alias [короткая команда]='[исходная команда]'

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

alias myScript='sh /путь/к/скрипту/script.sh'

Чтобы после добавления алиас сразу стал доступен, предварительно нужно обновить командную оболочку: 

source ~/.bashrc

После этого вы сможете вызывать ваш скрипт с помощью короткой команды.

Скрипт можно добавить в расписание планировщика cron, чтобы он запускался регулярно.

Как настроить cron по ssh

Переименование, перемещение и копирование файлов и папок

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

cp [что копируем] [куда копируем]

C её помощью можно, к примеру, создать копию конфигурационного файла, который вы хотите изменить. Здесь мы создаём копию конфигурационного файла nginx.conf

cp nginx.conf nginx.conf.copy

Папки копируются аналогично. При необходимости скопировать каталог со всем содержимым (рекурсивно) можно добавить к команде ключ -r:

cp -r /docs /files

Здесь мы создаём копию папки docs со всем её содержимым с именем files.

Переместить или переименовать файл также просто: 

mv [что переместить/переименовать] [куда переместить/как назвать]

Например, следующая команда переместит файл file.txt в папку new:

mv file.txt docs/new

Переименовать файл не сложнее:

mv /docs/new/file.txt /docs/new/todolist.txt

В этом примере файл file.txt переименовывается в todolist.txt

Аналогично можно перемещать и переименовывать директории. 

Теперь, когда вы можете перемещаться по серверу и работать с файлами и папками, самое время познакомиться с файловой структурой Linux-систем. 

Структура каталогов Linux

Добавить комментарий