Удаление папок в linux. Команда MKDIR и RMDIR для создания и удаления каталога

Доброго времени суток, дорогие читатели. Сегодня хотелось бы поговорить на тему удаления директории в PHP. Казалось бы, что операция не является сложной, однако некоторые нюансы имеют место быть. Давайте рассмотрим способы, как можно это сделать.

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

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

Пример реализации:

Function recursiveRemoveDir($dir) { $includes = glob($dir."/*"); foreach ($includes as $include) { if(is_dir($include)) { recursiveRemoveDir($include); } else { unlink($include); } } rmdir($dir); } //Удалим из текущей директории директорию tmp recursiveRemoveDir("tmp");
Какие проблемы у данного кода?

В простых случаях директория со всеми вложениями удалится. Но предположим, что в нашей директории присутствует скрытый файл, который начинается с точки, например, .htaccess . Функция glob() представляет из себя glob-подстановку UNIX, в которой по умолчанию не участвуют скрытые файлы (DOTFILES). Например, если мы зайдем в nix-терминал и будем использовать bash, то мы столкнемся с той же проблемой (речь именно о скрытых файлах в рамках glob). Для решения вопроса в bash существует команда shopt -s dotglob - она разрешает glob-подстановку скрытых файлов. В PHP же это можно решить добавлением дополнительно параметра GLOB_BRACE для glob() и расширением паттерна из первого параметра функции.

$includes = glob("tmp/{,.}*", GLOB_BRACE);
И тут так же есть проблема - мы столкнемся с бесконечным циклом, так как в массив войдут значения. и.. - что является на системном уровне текущей и родительской директорией. Придем мы к бесконечному циклу (а не к удалению всех родительских директорий), потому что. в рамках сортировки по умолчанию в сформированном массиве будет первее.. - то есть каждый раз мы будет обращаться к одной и той же директории. Для решения проблемы сформируем массив из данных системных директорий и в цикле удалим их индексы из основного массива. Также существует проблема символьных ссылок. Допустим, что в удаляемой директории размещена ссылка на другую директорию, в удалении содержимого которой мы абсолютно не заинтересованы. Для решения проблемы, перед созданием рекурсии, необходимо организовать проверку на то, что сущность не является ссылкой.

В итоге, функция обретает следующий вид:

Function recursiveRemoveDir($dir) { $includes = glob($dir."/{,.}*", GLOB_BRACE); $systemDots = preg_grep("/\.+$/", $includes); foreach ($systemDots as $index => $dot) { unset($includes[$index]); } foreach ($includes as $include) { if(is_dir($include) && !is_link($include)) { recursiveRemoveDir($include); } else { unlink($include); } } rmdir($dir); } //Удалим из текущей директории директорию tmp recursiveRemoveDir("tmp");
Код рабочий, но на самом деле можно было сделать и проще. В PHP существует класс FilesystemIterator, который уже по умолчанию имеет необходимые нам настройки. В конструктор передается путь до директории, листинг которой нам нужен. Нам достаточно просто создать объект.

Function recursiveRemoveDir($dir) { $includes = new FilesystemIterator($dir); foreach ($includes as $include) { if(is_dir($include) && !is_link($include)) { recursiveRemoveDir($include); } else { unlink($include); } } rmdir($dir); } //Удалим из текущей директории директорию tmp recursiveRemoveDir("tmp");
В заключение хотелось бы отметить еще один быстрый способ. Корректность его использования весьма сомнительна - отправить команду на выполнение в SHELL.

System("rm -rf tmp");
Обращаю внимание на высокий расход памяти и на то, что зачастую администраторы запрещают использовать на сервере такого рода функции в целях безопасности.

Теги: php, rmdir, glob, рекурсия

Бесплатное распространение, скорость работы и иммунитет к вирусам являются причиной перехода на операционные системы, работающие на ядре Linux. Первый вопрос, с которым сталкивается человек – работа с директивами. О том, как создать и удалить папку в Linux пойдет речь далее.

Как создать директорию в Linux

Решается вопрос двумя способами:

  • использовать встроенный файловый менеджер;
  • задать команду через терминал.

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

Как создать папку в Ubuntu через терминал

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

Чтобы создать каталог в Ubuntu, используют команду mkdir (от англ. – make directory). При этом нужно обладать правами на запись данных в родительском каталоге. Задание команды предполагает написание имени самой программы и перечисление следом за ней операндов (названий директорий). При необходимости указывают дополнительные опции:

  • - m – задает права доступа к папке;
  • -p – создает дерево папок.

Шаблон полной записи выглядит следующим образом:

mkdir-p-m права имя_папки1 имя_папки2 имя_папки3

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

Как создать папку в Линукс через файловый менеджер

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

Запускается программа путем клика по ее ярлыку на панели инструментов, а также используя меню Dash. Следующим шагом осуществляется переход к директории, в которой планируется создать дочернюю папку. Клик на пустом пространстве менеджера правой кнопкой мыши вызовет контекстное меню, где находится нужный пункт – «Создать папку». Остается задать имя новому каталогу. В отличие от Windows, Linux позволяет использовать все символы раскладки клавиатуры при выборе имени, за исключением дробной черты (слэша). Для сохранения результата необходимо кликнуть на свободном пространстве утилиты.

Права на папку Ubuntu

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

Средства Linux позволяют наложить ограничения на пользование папкой. Для просмотра установленных разрешений применяют команду ls-lt . Результатом ее выполнения является подобная запись:

Здесь d инициализирует namedir как директорию, а каждый последующий символ подразумевает соответствующее действие:

  • r – чтение;
  • w – запись в папку;
  • x – выполнение.

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

Для редактирования разрешений доступа к папке или файлу используют команду chmod . Она оперирует тремя цифровыми значениями:

  • 4 – открывает доступ к чтению;
  • 2 – позволяет осуществлять запись;
  • 1 – разрешает выполнение.

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

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

Теперь можно передать группе управление папкой:

chgrp accgroup namedir

Как сделать файлы общедоступными Linux Ubuntu

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

Необходимо кликнуть правой кнопкой мыши по ярлыку каталога и затем выбрать пункт «Общедоступная папка локальной сети». Если его нет – отсутствует дополнение Nautilus Share, которое легко находится в Ubuntu Software Center. После установки менеджер нужно перезапустить.

Если нужно организовать доступ по имени пользователя и паролю, устанавливается расширение System Config Samba. Через настройки оно позволяет добавить или удалить пользователя, для которого открывается директория.

Подробные инструкции по настройке Samba описаны в видео:

Как удалить папку в Linux

Ubuntu предоставляет возможность удалить каталог с помощью команды rmdir . Для этого записывается ее имя, и перечисляются каталоги (при условии нахождения в нужной директории):

rmdir namedir1 namedir2

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

rmdir home/dir1/namedir1

Чтобы удалить папку с файлами в Ubuntu, необходимо воспользоваться командой rm-rf :

Для удаления нескольких директорий с помощью rmdir их все нужно перечислить.

Заключение

Создать и удалить папку в Linux можно несколькими способами, каждый из которых обладает своими преимуществами. На выбор предоставляются файловый менеджер Nautilus и терминал. Если первый более привычен и удобен визуально, то второй ускоряет процесс и предоставляет большее количество возможностей.

Команды rm и rmdir удаляют файлы и каталоги в Linux, macOS и других Unix-подобных операционных системах. Они похожи на команды del и deltree в Windows и DOS. Эти команды очень мощные и имеют довольно много опций.

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

Как удалить файлы с помощью rm

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

Rm file_1.txt

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

Rm ./path/to/the/file/file_1.txt

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

Rm file_2.txt file_3.txt

Подстановочные знаки могут использоваться для выбора групп файлов, которые будут удалены. Знак * представляет несколько символов, а символ ? представляет один символ. Эта команда удалит все файлы изображений png в текущем рабочем каталоге.

Rm * .png

Эта команда удалит все файлы с одним символьным расширением. Например, это удалит File.1 и File.2, но не File.12.

Рм *.?

Если файл защищен от записи, вам будет предложено удалить файл. Вы должны ответить с помощью y или n и нажать «Enter».

Чтобы снизить риск использования rm с подстановочными знаками, используйте параметр -i (интерактивный). Для этого необходимо подтвердить удаление каждого файла.

Rm -i * .dat

Опция -f (сила) противоположна интерактивной. Он не запрашивает подтверждение, даже если файлы защищены от записи.

Rm -f имя_файла

Как удалить каталоги с помощью rm

Чтобы удалить пустой каталог, используйте опцию -d (directory). Вы можете использовать подстановочные знаки (* и?) В именах каталогов так же, как и в именах файлов.

Rm -d directory

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

Rm -d directory1 directory2 /path/to/directory3

Чтобы удалить не пустые каталоги, используйте параметр -r (рекурсивный). Чтобы было ясно, это удаляет каталоги и все файлы и подкаталоги, содержащиеся в них.

Rm -r directory1 directory2 directory3

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

Rm -rf directory

Здесь требуется осторожность. Ошибка в команде rm -rf может привести к потере данных или неисправности системы. Это опасно, и осторожность — лучшая политика. Чтобы получить представление о структуре каталогов и файлах, которые будут удалены командой rm -rf, используйте команду tree .

Используйте apt-get для установки этого пакета в вашу систему, если вы используете Ubuntu или другой дистрибутив на основе Debian. В других дистрибутивах Linux используйте инструмент управления пакетами вашего дистрибутива Linux.

Sudo apt-get install tree

Выполнение команды tree дает простую для понимания диаграмму структуры каталогов и файлов под каталогом, из которого она запускается.

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

Tree path/to/directory

Команда rm также имеет параметры --one-file-system , --no-preserve-root , --preserve-root , но они рекомендуются только для опытных пользователей. Если вы что-то не так, вы можете случайно удалить все ваши системные файлы.

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

Есть еще одна команда rmdir , которую вы можете использовать для удаления каталогов. Разница между rm и rmdir том, что rmdir может удалять только пустые каталоги. Он никогда не удалит файлы.

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

Удалите один каталог в текущем каталоге, передав его имя в rmdir:

Rmdir directory

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

Rmdir directory1 directory2 directory3

Удалите каталог не в текущем каталоге, указав полный путь к этому каталогу:

Rmdir /path/to/directory

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

Когда rmdir выдает ошибку «Directory not empty», он прекращает обработку каталогов, переданных ему в командной строке. Если вы попросили удалить четыре каталога, а в первом содержались файлы, rmdir выдаст вам сообщение об ошибке и больше ничего не сделает. Вы можете заставить его игнорировать эти ошибки с --ignore-fail-on-non-empty чтобы обрабатывать другие каталоги.

В следующем примере две папки были переданы в rmdir , это work/reports и work/quotes. Параметр --ignore-fail-on-non-empty включен в команду. В папке work/reports находятся файлы, поэтому rmdir не может удалить ее. Опция --ignore-fail-on-non-empty заставляет rmdir игнорировать ошибку и переходить к следующей папке, которую он должен обработать, это work/quotes. Это пустая папка, и rmdir удаляет ее.

Эта команда использовалась.

Rmdir --ignore-fail-on-non-empty work/reports /work/quotes

Вы можете использовать опцию -p (parent), чтобы удалить каталог, а также удалить его родительские каталоги. Этот прием работает, потому что rmdir начинается с целевого каталога, а затем возвращается к родительскому. Теперь этот каталог должен быть пустым, поэтому он может быть удален rmdir, и процесс повторяет шаг назад по пути, предоставленному rmdir.

В следующем примере команда, переданная в rmdir:

Rmdir -p work/invoices

Каталоги invoices и work удаляются по запросу.

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

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

Рекомендации помогут Вам полностью удалить папку через командную строку . В статье про , использовалась команда DEL, которая предназначена именно для файлов. В случае с папками, применимы команды RD или RMDIR.

Для достижения цели, . Введите RD /? и бегло ознакомьтесь с особенностями и параметрами команды. Здесь Вы увидите всего лишь 2 параметра:

  1. /s - при использовании этого префикса, удалится папка, а также все вложенные в нее элементы. Если Ваш каталог не пустой, и Вы не прописали это параметр, тогда у Вас ничего не выйдет.
  2. /Q - используется при удалении без подтверждения.

В общем виде конструкция выглядит таким образом:

RD или RMDIR /s/q “полный путь папки”

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

Удаление папки с подтверждением и без

У себя на компьютере я создал каталог с названием «cmd» и скопировал в него несколько объектов. Далее ввел в командную строку такую команду:

RD /s “c:\cmd”

Затем нажал Enter и клавишу Y, так как cmd сделала запрос на подтверждение удаления.

Проверив диск C, я не обнаружил каталога. Далее создал папку с именем «удалить» и также скопировал 5 файлов, но при вводе команды, убрал префикс /s. Получилось так:

RMDIR “c:\удалить”

После нажатия Enter, удаления не произошло, а в командной строке высветилось сообщение, что папка не пуста. Вывод, без параметра /s Вы сможете удалить только пустую папку, следовательно, использование без данного префикса практически бесполезно.

Если Вам лень вводить букву подтверждения (Y или N), тогда следующая конструкция для Вас. Выше упоминался префикс /q, именно он убирает надоедливый ввод букв (для доказательства смотрите скрин).