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

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

sk@sk:~$ sudo sh -c "sync; echo 3 > /proc/sys/vm/drop_caches"

Однако, если вы хотите заставить ОС Linux очистить кеш памяти на определенный интервал, просто добавьте команда для задания cron. Здесь я покажу вам, как.

Откройте свой терминал и введите следующую команду, чтобы создать файл cacheclear.sh. Скажем, например, я создаю файл cacheclear.sh в каталоге my / home:

sk@sk:~$ sudo vi /home/cacheclear.sh

Добавьте следующие строки в файл cacheclear.sh:

#!/bin/sh 
sudo sh -c "sync; echo 3 > /proc/sys/vm/drop_caches"

Сохраните и выйдите из файл. Теперь добавьте этот файл в корневой каталог crontab:

sk@sk:~$ sudo crontab -e

Эта команда открывает корневой crontab.

Добавьте следующую строку в конец:

0 * * * * /home/cacheclear.sh
[d7 ] Сохранить и выйти из файла. Как только вы закончите, задание cron будет запускать эту команду каждый час и очистит кэш системной памяти.

1
задан 23 November 2014 в 10:48

8 ответов

Чтобы удалить папку со всем ее содержимым (включая все внутренние папки):
rm -rf /path/to/directory
Чтобы удалить все содержимое папки (включая все внутренние папки), но не самой папки:
rm -rf /path/to/directory/*
Чтобы удалить все «файлы» «изнутри папки (не удаляя внутренние папки):
rm -f /path/to/directory/*

Где:

Чтобы удалить папку со всем ее содержимым (включая все внутренние папки): [ f1] -f - означает «сила», которая полезна, когда вы не хотите, чтобы вас спросили / предложили, если вы хотите удалить архив, например. Чтобы удалить все содержимое папки (включая все внутренние папки), но не самой папки:
rm -rf /path/to/directory/*
107
ответ дан 25 May 2018 в 18:58
  • 1
    Я нашел, что это более полный и полезный ответ, помимо ответа, который был отмечен как «Принято». – inspirednz 20 August 2016 в 04:58
  • 2
    rm -rf /path/to/directory/* не удаляет скрытый файл в папке, например. [F2]. Может быть, rm -rf /path/to/directory/.? Не пробовал. – Mark Berry 29 March 2017 в 04:33
  • 3
    @MarkBerry rm -rf /path/to/directory/.* – Lilian A. Moraru 29 March 2017 в 17:57
  • 4
    @ LilianA.Moraru, я провел некоторое тестирование сегодня. rm -rf /path/to/directory/.* удаляет только скрытый файл (ы) в указанном каталоге. Глядя на комментарий @ danjjl на ответ @ Rinzwind, чтобы удалить скрытые файлы, запустите shopt -s dotglob перед запуском rm -rf /path/to/directory/*. – Mark Berry 30 March 2017 в 01:59

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

rm -rf /path/to/directory/{*,.*}
23
ответ дан 25 May 2018 в 18:58
  • 1
    Это должен быть прекрасный принятый ответ. Спасибо! – Nam G VU 22 September 2016 в 18:53
  • 2
    Не соответствует ли этот glob «.». и ".." слишком? – hertzsprung 8 January 2017 в 17:28
  • 3
    @hertzsprung - он делает, и он даст вам предупреждение о том, что он не может удалить ./ и ../, но он все равно удалит скрытые файлы. – Ryan Wheale 1 February 2017 в 01:12

Если вы хотите удалить только файлы в каталоге / path / to /, вы можете сделать

find /path/to/directory -type f -print0| xargs -0 rm 

или

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

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

7
ответ дан 25 May 2018 в 18:58
  • 1
    GNU find как предикат -delete. Если вы все еще хотите использовать -exec, подстановка \; на + будет собирать rm вызовы вместе, повышая эффективность. – enzotib 6 September 2011 в 17:19
  • 2
    большое количество файлов с «+» вызовет проблемы, так как список будет слишком большим, так же как rm -f *. и при удалении большого количества файлов из одной и той же папки (говорящей в миллионе) оба они не хороши :) В конце C ++ пришла и удалила файлы в порядке inodes в dir-tree. – Osis 6 September 2011 в 17:53
  • 3
    Вы действительно должны добавить a - после rm. Без этого, если у вас есть имена файлов -rf или подобные, они будут интерпретироваться как аргументы для rm. например xargs -0 rm - или -exec rm - {} \; – Richm 6 September 2011 в 18:52
  • 4
    вы также можете указать аргумент -n для xargs. Это заставит его разделить команды rm на максимальное количество аргументов, то есть «xargs -n 100 -0 rm -» удалит файлы в кусках 100. – Richm 6 September 2011 в 18:54
  • 5
    Вы также можете добавить -maxdepth 1, чтобы гарантировать, что find не возвращает файлы из любых подкаталогов. то есть find / path / to / directory -maxdepth 1-type f – Richm 6 September 2011 в 19:10

Если вы также хотите удалить все подкаталоги и сам каталог, вы можете использовать rm -rf /path/to/directory. Но всегда проверяйте свою линию, прежде чем нажимать «возврат», rm -rf может вызвать много хаконов, например, если вы случайно вставляете пробел после первой косой черты при наличии прав суперпользователя ...

6
ответ дан 25 May 2018 в 18:58

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

удалить папку, а затем воссоздать ее
rm -rf dir_name && mkdir dir_name
использовать find
find dir_name -mindepth 1 -delete  
[ ! d2]

Здесь мы указываем -mindepth 1 для исключения самого каталога dir_name. Взгляните на следующую ссылку: https://unix.stackexchange.com/questions/12593/how-to-remove-all-the-files-in-a-directory

5
ответ дан 25 May 2018 в 18:58
  • 1
    Спасибо за ваш совет, и я добавил дополнительные пояснения к ссылкам. – zeekvfu 28 November 2013 в 11:04
  • 2
    Будьте осторожны, так как удаление и повторное создание папки могут привести к разным / неправильным разрешениям для этой папки! – einjohn 29 August 2015 в 15:20

Вы можете cd войти в каталог, а затем запустить команду rm *.* так же, как в DOS, если вы помните.

1
ответ дан 25 May 2018 в 18:58
  • 1
    DOS - это DEL для файлов и RMDIR для опустошенных каталогов, а скрытые и системные файлы должны сначала удалить эти атрибуты ATTRIB. Не так просто;) – Eric 10 June 2015 в 16:03

Чтобы удалить текущий каталог, вы можете использовать, например, rm -d ./*

-d, чтобы удалить каталоги.

0
ответ дан 25 May 2018 в 18:58

Поскольку этот вопрос постоянно находится на вершине Google, когда я сам это ищу:

Другие ответы страдают от разных проблем:

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

Итак, чтобы РЕЗУЛЬТАТИВНО удалить все файлы и папки в каталоге, сделайте следующее:

find "${DIR}" -xdev -mindepth 1 -printf "%d\t%y\t%p\0" | sort -z -r -n | cut -z -f3- | xargs -0 -r -- rm -d --

Обратите внимание, что я добавил аргумент -xdev, чтобы предотвратить спуск в mounts (например [ f6] и т. д.).

Почему бы не -depth или -delete?

Несмотря на то, что люди постоянно меня заворачивают, эти методы имеют недостаток: это не похоже на они достаточно расширяемы, чтобы позволить -prune вводить подкаталог (не вводя больше проблем). В отличие от этого метода вы можете вставить

-not \( -path "${DIR}/subdir" -prune \)

перед аргументом -mindepth, чтобы исключить subdir из его содержимого.

-1
ответ дан 25 May 2018 в 18:58
  • 1
    И для первого порядка глубины для этого есть -depth флаг в find. – Sergiy Kolodyazhnyy 21 May 2018 в 04:36
  • 2
    Ну ... почему бы просто не использовать -delete с find ? -delete является глубиной. Вы уже предполагаете не-POSIX find с -printf, поэтому вы можете использовать -delete или -depth -print0 | xargs -0 rm – muru 21 May 2018 в 09:41
  • 3
    @muru: Потому что я не знал лучше ... Я изменю его. – Mehrdad 21 May 2018 в 09:47
  • 4
    @muru: На самом деле, кажется, ваш метод не работает с -not \( -path "$DIR/subdir" \) ... но мой делает? Зачем? – Mehrdad 21 May 2018 в 10:00
  • 5
    @Mehrdad, что это должно делать? – muru 21 May 2018 в 10:06

Другие вопросы по тегам:

Похожие вопросы: