Удаление каталога в Linux: практика с терминалом

Как удалить каталог в Linux с помощью терминала? Какая команда позволяет удалить каталог?

Используя команды rm или rmdir, вы можете удалить каталог в системах Linux. Команда rmdir может использоваться для удаления пустого каталога. Если каталог Linux содержит файлы или подкаталоги, то правильная команда — это команда rm.

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

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

Это руководство поможет вам ознакомиться с командами удаления каталога в Linux. Это также придаст вам больше уверенности в работе с системами Linux.

Давайте узнаем, как удалить каталог в Linux!

Удалите пустой каталог в Linux с помощью команды rmdir

Вот простой пример: сначала создайте каталог с именем testdir с помощью команды mkdir:

(localhost)$ mkdir testdir
(localhost)$ ls -al
total 0
drwxr-xr-x 3 myuser mygroup 96 15 Jul 00:10.
drwxr-xr-x 13 myuser mygroup 416 15 Jul 00:10..
drwxr-xr-x 2 myuser mygroup 64 15 Jul 00:10 testdir

Вы можете использовать команду rmdir для удаления этого каталога:

rmdir testdir

Чтобы удалить пустые каталоги в Linux, вы можете использовать команду rmdir.

Теперь давайте воссоздадим тот же каталог, но на этот раз с помощью команды touch мы также создадим файл внутри каталога testdir.

Затем мы пытаемся удалить этот каталог с помощью команды rmdir.

(localhost)$ mkdir testdir
(localhost)$ touch testdir/testfile
(localhost)$ rmdir testdir
rmdir: testdir: Directory not empty

…Linux возвращает ошибку «Каталог не пуст».

Причина этой ошибки становится ясной, когда мы проверяем руководство по команде rmdir.

удалить каталог в Linux с помощью rmdir

Как вы можете видеть на странице руководства, команда rmdir удаляет только пустой каталог.

Итак, как нам удалить каталог, который не пуст?

Как удалить каталог в Linux, если он не пуст

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

Мы будем использовать команду rm с тем же каталогом, который нам не удалось удалить в предыдущем разделе с помощью команды rmdir.

Давай посмотрим что происходит…

(localhost) $ rm testdir/
rm: testdir/: is a directory

Все равно не работает, почему?

По какой-то причине мы получаем сообщение об ошибке, в котором говорится, что testdir является каталогом.

Это потому, что нам нужно использовать флаг -d, который, согласно руководству rm, позволяет команде rm удалять каталоги, а также другие типы файлов (вы можете использовать команду rm для удаления файлов и каталогов в Linux).

Теперь мы попытаемся удалить каталог, передав флаг -d команде rm:

(localhost) $ rm -d testdir/
rm: testdir/: Directory not empty

И все же, не повезло!

На этот раз проблема в том, что каталог не пуст. Мы наблюдаем то же поведение, что и команда rmdir.

Здесь нам может помочь другой флаг для команды rm…

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

rm -r testdir

Окончательно! Мы удалили каталог.

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

Чтобы избежать этого, особенно если вы удаляете каталог, содержащий большое количество файлов, вы можете указать флаг -f, который означает Force.

В приведенном ниже примере я использую команду chmod для удаления разрешений на запись из testfile1.

(localhost) $ mkdir testdir
(localhost) $ touch testdir/testfile1
(localhost) $ touch testdir/testfile2
(localhost) $ chmod -w testdir/testfile1 
(localhost) $ rm -r testdir
rm: remove write-protected regular empty file ‘testdir/testfile1’? y 

Как видите, если мы не используем флаг -f, команда запрашивает подтверждение, поскольку файл защищен от записи.

Попробуем удалить каталог также с помощью флага -f:

(localhost) $ mkdir testdir
(localhost) $ touch testdir/testfile1
(localhost) $ touch testdir/testfile2
(localhost) $ chmod -w testdir/testfile1 
(localhost) $ rm -fr testdir 

Как и ожидалось, в последнем примере мне не пришлось подтверждать удаление файла, защищенного от записи.

Удалить несколько каталогов в Linux с помощью команды rm

Команда rm может удалить несколько каталогов Linux с помощью одной команды.

Вы можете сделать это, указав каталоги в команде rm и разделив их пробелом:

rm -fr testdir1 testdir2 testdir3

Вы также можете использовать подстановочный знак, если не хотите указывать имена всех каталогов и хотите удалить их все:

rm -fr testdir*

В примере выше начало названия каталогов было одинаковым.

Давайте посмотрим еще один пример подстановочного знака, когда последняя часть имени каталогов совпадает:

mkdir test1_dir test2_dir test3_dir
rm -fr *_dir

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

Удаление каталогов в Linux с помощью команды Find

Иногда нам нужно удалить каталоги, соответствующие определенному шаблону.

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

Команда find позволяет вам искать файлы или каталоги в файловой системе и выполнять операцию с теми файлами или каталогами, которые соответствуют вашим критериям поиска.

Начнем с общего примера использования команды find для удаления каталогов, имя которых соответствует определенному шаблону, например каталогов, имя которых начинается с «tmp_».

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

(localhost) $ ls -al
total 0
drwxr-xr-x 7 myuser mygroup 224 16 Jul 08:18.
drwxr-xr-x 13 myuser mygroup 416 15 Jul 00:10..
drwxr-xr-x 2 myuser mygroup 64 16 Jul 08:18 config
drwxr-xr-x 2 myuser mygroup 64 16 Jul 08:18 logs
drwxr-xr-x 2 myuser mygroup 64 16 Jul 08:18 tmp_dir1
drwxr-xr-x 2 myuser mygroup 64 16 Jul 08:18 tmp_dir2

Команда поиска, которая идентифицирует каталоги с именем, начинающимся с «tmp_», выглядит следующим образом:

find. -type d -name 'tmp_*'

Флаг -type со значением d ограничивает поиск каталогами, а флаг -name позволяет передавать шаблон, которому мы хотим, чтобы имя каталога соответствовало.

Вывод команды:

./tmp_dir2
./tmp_dir1

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

find. -type d -name 'tmp_*' -exec rm -r {} \;

Для каждого результата, найденного командой find, выполняется команда после -exec.

Фигурные скобки ({}) заменяются результатом команды find.

Когда вы запускаете команду ниже, два каталога удаляются, как и ожидалось, но вы также видите следующую ошибку:

find:./tmp_dir2: No such file or directory
find:./tmp_dir1: No such file or directory

Почему?

Возьмем в качестве примера tmp_dir1…

Команда find идентифицирует эти два каталога на основе флагов -type и -name. Он удаляет каталоги и после этого пытается получить к ним доступ, чтобы найти внутри этих каталогов что-нибудь еще, соответствующее тому же шаблону.

Вот почему мы видим эту ошибку. Команда find пытается войти в каталог после его удаления.

Удалить каталог в Linux, если он старше X дней

Распространенным требованием является удаление каталога в зависимости от его возраста.

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

Для этого мы по-прежнему можем использовать команду find и можем начать с команды, описанной в предыдущем разделе.

Давайте посмотрим, как…

Команда find поддерживает флаг -ctime, за которым следует количество дней.

Следующая команда удалит каталоги, для которых время изменения старше 7 дней:

find. -type d -name 'tmp_*' -ctime +7 -exec rm -r {} \;

Более поздние версии команды find также поддерживают знак плюса (+) вместо точки с запятой (;), поэтому вы также можете написать предыдущую команду, как показано ниже:

find. -type d -name 'tmp_*' -ctime +7 -exec rm -r {} +

Версия команды с+в конце оптимизирует производительность системного вызова exec Linux.

Вы можете просто обновить значение флага -ctime в зависимости от ваших требований, например, для удаления каталогов старше 30 дней команда будет выглядеть так:

find. -type d -name 'tmp_*' -ctime +30 -exec rm -r {} +

Почему я не могу удалить каталог в Linux?

Если есть каталог, который вы не можете удалить в Linux, есть два возможных варианта:

  1. У вашего пользователя есть разрешения файловой системы на удаление каталога: в этом случае убедитесь, что вы используете правильную команду для удаления каталога. Если каталог не пуст, для его удаления необходимо использовать команду rm и передать ей флаг -r для рекурсивного удаления.
  2. У вашего пользователя нет разрешений файловой системы для удаления каталога: либо вам не следует разрешать это делать, либо разрешения файловой системы настроены неправильно, и их необходимо изменить, чтобы позволить вашему пользователю удалить каталог.

Как удалить родительский каталог в Linux?

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

Давайте откроем терминал Linux и выполним команду pwd, чтобы проверить текущий рабочий каталог:

(localhost) $ pwd
/opt/tutorial/test_dir

В этом случае /opt/tutorial/test_dir — это текущий рабочий каталог, а /opt/tutorialродительский каталог.

Чтобы просмотреть содержимое родительского каталога, вы можете использовать команду ls -al../, которая показывает содержимое каталога на один уровень выше текущего (родительского каталога).

(localhost) $ ls -al../
total 0
drwxr-xr-x 3 codefathertech codefathertech 96 21 Apr 18:58.
drwxr-xr-x 169 codefathertech codefathertech 5408 21 Apr 18:58..
drwxr-xr-x 2 codefathertech codefathertech 64 21 Apr 18:58 test_dir

Примечание. Не удаляйте каталоги, необходимые для работы операционной системы Linux (некоторые из них: /etc, /opt, /var, /bin, /home, /tmp, /usr).

Заключение

Теперь вы должны хорошо понимать, как использовать команды Linux rmdir и rm для удаления каталога в терминале Linux.

Мы также увидели, как удалить несколько каталогов с помощью одной команды, узнали некоторые флаги rm и как удалять каталоги с помощью команды find (на основе критериев поиска).