Как удалить файл или папку из терминала?
Чтобы удалить файл или папку (а здесь корректно говорить не о папках, а о директориях) из терминала Линукс используются команды rm и rmdir , по аналогии с командами del и deltree в консоли cmd Windows. Команды просты и опциями небогаты. Это не тот вариант, к которому будет прибегать заурядный пользователь во время работы в полноценно работоспособной системе. Однако для тех, кто запускает cron-задачи при помощи скрипта или при работе из ремонтного терминала с вылетевшим GUI, команды могут пригодится.
Сразу нужно отметить, что удалённые файлы и директории с помощью этих команд удаляются из системы минуя Корзину, так что вы должны быть уверены в том, что делаете.
Как удалить файл и папку из терминала: команда rm
Простейшая команда на удаление выглядит как
rm путь-к-файлу/файл.расширение
Файлы можно удалять массово, указывая их имена через пробел:
Rm файл1.txt файл2.txt файл3.txt
При удалении файлов скопом также успешно используются и групповые символы. Как всегда в таких случаях, можно применять * и ? . “Звёздочкой” вы обозначаете множество символов, ? – одиночные. Например, для удаления ряда фотографий из выбранной папки можно использовать:
Rm *.jpeg
Причём групповые символы можно использовать для выделения и имён и расширений файлов. Чтобы, к примеру, удалить все фотографии с расширением jpeg , а рисунки с расширением png оставить, можно ввести команду в виде:
Rm *.????
Если файл, предполагаемый к удалению защищён ограничительными атрибутами (типа “только для чтения”), терминал затребует подтверждение. В случае, когда вам захочется всё-таки контролировать процесс удаления файла, дополните команду флагом -i . Теперь для удаление каждого из файлов нужно будет подтверждать действие:
Соглашаться придётся на английском:
Но. В противовес флагу -i есть флаг -f . Он в команде rm удалить любые файлы, даже если те защищены создателем или системой:
Rm -f Файл.txt
Как удалить папку из терминала с помощью rm?
Командой rm можно избавляться и от папок и директорий. Но содержимое команды будет отличаться в зависимости от содержимого самой удаляемой директории. Так, если директория пуста, команда примет вид:
rm -d путь-к-директории
Если в директории что-то есть, меняем флаг на -r :
rm -r путь-к-директории
Защищённую папку удаляем на знакомый уже манер:
rm -rf папка
Команда сколь проста, столь же и опасна. Нерадивое её использование может привести к случайному затиранию жизненно важных директорий Кали. Потому для получения представления о составе директории прямо из терминала можно предварительно запастись скриптом древовидного отображения содержимого папок и директорий Линукс. Установим…
Apt-get install tree
и посмотрим:
Как удалить папку из терминала с помощью rmdir?
Почти тоже самое, что и предыдущий вариант с одним, но серьёзным отличием
rmdir = rm -d
Да. Командой rmdir можно удалять только пустые директории. Также единично или массово, также указывая полный путь:
Rmdir папка1 папка2
Если папка не пуста, rmdir выдаст ошибку:
Это, впрочем, не всегда удобно, если папки удаляются скопом. Вы в этом случае можете добавить флаг
Ignore-fail-on-non-empty
в начале команды, чтобы массовое удаление пустых (предположительно) директорий не прекратилось как только rmdir наткнётся на непустую папку:
Rmdir --ignore-fail-on-non-empty папка1 папка2
Однако, если родительская директория содержит пустые папки, и она вам также не нужна, вы можете удалить и дочерние и родительскую одной командой, добавив флаг -p :
rmdir -p директория/папка
Трюк сработает потому, что 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, рекурсия
Команда rmdir поможет нам удалить пустую директорию, то есть директорию без файлов и папок. Синтаксис команды очень прост:
Rmdir DIRNAME
В случае если директория не пуста вы увидите следующее сообщение об ошибке.
$ rmdir test rmdir: failed to remove `test": Directory not empty
2. Как удалить вложенные директории в Linux?
С помощью опции -p вы можете удалить директорию с вложенной в неё поддиректорией.
$ rmdir -p dir1/dir2/dir3
Команда rmdir -p dir1/dir2/dir3 это эквивалент команды
$ rmdir dir1/dir2/dir3 dir1/dir2 dir1
3. Удаление директории с содержимым
Если вам потребовалось удалить директорию с содержимым вы можете использовать команду rm :
$ rm -rf DIRNAME
Эта команда удалит директорию, включая все содержащиеся в ней файлы и поддиректории. С осторожностью пользуйтесь данной командой, так как восстановление удаленных файлов не будет легкой процедурой.
4. Интерактивное удаление
Во избежание случайного удаления нужных файлов рекомендую рассмотреть возможность использования опции -i для интерактивного удаления файлов и папок (особенно с правами root).
Рекурсивное и интерактивное удаление директории.
# rm -ir DIRNAMEИнтерактивное удаление файла.
# rm -i FILENAME5. Полезные алиасы для команд rm и rmdir
Вы можете использовать интерактивное удаление в качестве поведения команды rm по умолчанию.
Алиас для постоянного выполнения rm в интерактивном режиме
# alias rm="rm -i"При использовании команды rm на самом деле будет выполняться команда rm -i . Но необходимо обратить внимание на один ньюанс. Не используйте опцию -i в дальнейшем, так как вы не получите желаемого эффекта. Рассмотрим пример:
В следующей команде использование -i не даст вам ожидаемый эффект..
$ rm -irf DIRNAME
В этом случае, при использовании алиаса, команду выше необходимо запускать следующим образом:
$ rm -rf DIRNAME
Все указанные ниже команды эквивалентны и выполняют один и тот же функционал.
- rm -fr
- rm -rf
- rm -r -f
- rm -f -r
Если вам необходима экспертная оценка здания, рекомендую заказать обследование готовых зданий специалистами научно-производственного центра «Технопласт»
Команды 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 параметра:
- /s - при использовании этого префикса, удалится папка, а также все вложенные в нее элементы. Если Ваш каталог не пустой, и Вы не прописали это параметр, тогда у Вас ничего не выйдет.
- /Q - используется при удалении без подтверждения.
В общем виде конструкция выглядит таким образом:
RD или RMDIR /s/q “полный путь папки”
Примечание: при применении конструкции, каталог и его содержимое полностью удалится с компьютера и Вы не найдете его в корзине. Для безопасности сделайте резервную копию папки.
Удаление папки с подтверждением и без
У себя на компьютере я создал каталог с названием «cmd» и скопировал в него несколько объектов. Далее ввел в командную строку такую команду:
RD /s “c:\cmd”
Затем нажал Enter и клавишу Y, так как cmd сделала запрос на подтверждение удаления.
Проверив диск C, я не обнаружил каталога. Далее создал папку с именем «удалить» и также скопировал 5 файлов, но при вводе команды, убрал префикс /s. Получилось так:
RMDIR “c:\удалить”
После нажатия Enter, удаления не произошло, а в командной строке высветилось сообщение, что папка не пуста. Вывод, без параметра /s Вы сможете удалить только пустую папку, следовательно, использование без данного префикса практически бесполезно.
Если Вам лень вводить букву подтверждения (Y или N), тогда следующая конструкция для Вас. Выше упоминался префикс /q, именно он убирает надоедливый ввод букв (для доказательства смотрите скрин).