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


76

Я пытаюсь удалить все файлы и подкаталоги в каталоге. Раньше я rm -rудалял все файлы, но хочу удалить все файлы и подкаталоги, кроме самого верхнего каталога.

Например, у меня есть верхний каталог, как images. Он содержит файлы header.png, footer.pngи подкаталог.

Теперь я хочу , чтобы удалить header.png, footer.pngи подкаталог, но не images.

Как я могу сделать это в Linux?


1
Перейдите в каталог и сделайте rm -Rfвсе файлы и каталоги там.
Нуфал Ибрагим

Ответы:


59

Если ваша директория верхнего уровня называется images, тогда запустите rm -r images/*. При этом используется оператор glob оболочки *для запуска rm -rв каждом файле или каталоге images.


30
скрытый файл не будет удален.
reto

51

Чтобы удалить скрытые файлы, вы должны указать:

rm -r images/* images/.*

С оболочками, чьи глобусы включают .и .., это приведет к ошибке вроде

rm: cannot remove `.' directory `images/.'
rm: cannot remove `..' directory `images/..'

но это удалит скрытые файлы.

Подход без сообщения об ошибке заключается в использовании поиска / удаления с помощью mindepth. Это гну-найти.

find images -mindepth 1 -delete

В вашей находке может отсутствовать предикат -mindepthor -delete, в этом случае вы можете сделать следующее:

find images/. ! -name . -prune -exec rm -rf {} +

Я предложил использовать 'rm -r images /.*', который будет соответствовать 'images / ..', но не 'images /../ ..'. Рекурсия не может идти вверх, так как 'images /../ images / ..' снова тот же каталог.
пользователь неизвестен

4
@DarkHeart rm .*не удаляет .или ..и не имеет по крайней мере с 1994 года для утилитами GNU и , вероятно , с конца 70 - х годов для UNIX . Крайне маловероятно, что вы найдете систему, которая rm .*пересекает файловую систему вверх за пределами музея.
Terdon

21

Чтобы удалить все файлы и каталоги (включая скрытые ) в каталоге, вы можете попробовать следующее:

  • использовать ls -Abдля сопоставления всех файлов / каталогов

    cd dir_name && rm -rf `ls -Ab`
    
  • использовать findдля сопоставления всех файлов / каталогов

    find dir_name -mindepth 1 -delete
    

    или, если ваш findне поддерживает -delete:

    find dir_name -mindepth 1 -exec rm -rf {}
    
  • удалить папку, а затем воссоздать ее

    rm -rf dir_name && mkdir dir_name
    
  • в баш,

    shopt -s dotglob  
    rm -rf dir_name/*
    

Обратите внимание, что команда like rm -rf *не является безопасной, если у вас нет сведений о файлах в каталоге, поскольку файл, начинающийся с -(дефис), будет интерпретироваться как rmфлаг ...
VasyaNovikov

1
РЕДАКТИРОВАТЬ: чтобы сделать это безопасно, используйтеrm -rf ./* ./.*
VasyaNovikov

9

Чтобы рекурсивно удалить все обычные файлы внутри каталога, эта команда (при условии, что GNU или FreeBSD find) достаточно хороша:

find . -type f -delete

Это оставляет все нестандартные файлы, такие как символические ссылки (указывают ли они на обычные файлы или нет), каталоги, fifos, сокеты, устройства ...

Смотрите также:

find . ! -type d -delete

удалить файлы любого типа, кроме каталога .



3

Я использую findкоманду здесь:

Шаг 1: Найдите все файлы и удалите их:

find /path/to/directory/ -type f -exec rm {} \;

Пример:

find /home/user/Desktop/images/ -type f -exec rm {} \;

Шаг 2: Найдите все подкаталоги и удалите их:

find /path/to/directory/ -type d -exec rm -R {} \;

find /path/to/directory/ -type dВключает .так, удалит сам каталог. Вы должны также использовать -mindepthпереключатель, как говорили другие.
Артур Такка

3

Вопрос заключался в том, чтобы очистить каталог = удалить содержимое каталога, включая скрытые файлы, но не сам каталог. Команда find с -mindepth 1 на самом деле правильный путь, но чтобы избежать сообщений об ошибках, ее необходимо объединить с -maxdepth 1:

find /path/to/dir -mindepth 1 -maxdepth 1 -exec rm -rf '{}' \;

0

Синтаксис rm:

rm [OPTION]... FILE...

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

rm -r sub_dir/

0

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

sudo rm -r directoryname1/2/3/*

После 3 / * будет удален весь каталог.

Пример sudo rm -r Downloads / song / *

Будут удалены все файлы, которые находятся внутри Downloads/song.


0

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

Из каталога, в котором находится каталог изображений.

rm -frd ./images/*

до:

images/
    |_ header.png
    |_ footer.png
    |_ subdir/

после:

images/

Не уверен, что это было ясно в исходном вопросе, но только для того, чтобы указать, что если вы не включите dotglob, это пропустит любой «точечный файл» или точечный каталог в images ( mkdir images/.somedir; touch images/.somefile)
Джефф Шаллер

0

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

rm -rf .[^.] .??* *

Или из родительского каталога:

rm -rf images/.[^.] images/.??* images/*

С https://serverfault.com/a/47940/269538 .



-2

Удалите папку «test» и все файлы внутри:

 rm -r test

Удалите все файлы внутри, но сохраните папку «test»:

 rm -r test/*

-4

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

ls |xargs rm -rf

2
Это не удастся для имен файлов, которые содержат пробелы. Я бы рекомендовал не использовать вывод ls в качестве ввода для других команд, это обычно небезопасно.
дхаг
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.