Как очистить содержимое папок без удаления самих папок
Перейти к содержимому

Как очистить содержимое папок без удаления самих папок

  • автор:

Как в Windows 10 удалить файлы, но оставить структуру папок

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

Копирование структуры

Воспользуемся для этих целей встроенной консольной утилитой XCOPY. Предположим, что у нас есть папка Data с вложенными каталогами, в которых содержаться некие файлы, которые нужно удалить.

Создав пустую папку Data в другом месте, открываем PowerShell или командную строку и выполняем команду XCOPY «путь-к-папке-с-файлами «путь-к-пустой-папке» /T /E .

XCOPY

В результате в пустой каталог Data будет скопировано дерево папок первой папки Data , но уже без файлов. Естественно, первую папку можно удалить.

С помощью Total Commander

Если у вас есть файловый менеджер Total Commander, используем встроенную функцию вывода содержимого без каталогов.

Зайдите в программе в каталог с содержимым и нажмите Ctrl + B .

Total Commander

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

Выделить и удалить

Папки при этом останутся на месте.

Рекурсивным методом в PowerShell

Почистить папки от файлов можно и с помощью PowerShell .

Для этого в запущенной консоли выполняем команду:

Get-ChildItem -Path «путь-к-папке» -Include *.* -File -Recurse | foreach

PowerShell

Этой командой мы рекурсивно проходим по каталогам, получаем список файлов и удаляем их. Удалены, однако, будут только те файлы, которые имеют расширение или точку в имени.

Приведенная здесь команда тем хороша, что позволяет удалять файлы по маске. Так, добавив к точке расширение TXT (*.txt*) , вы удалите только текстовые файлы с данным расширением. Но есть у нее и свой недостаток, — все файлы удаляются мимо Корзины, поэтому перед очисткой каталогов всё же рекомендуется создавать их резервные копии.

Советы чайника

Простые советы, представляющие собой пошаговые инструкции по оптимизации и работе в операционных системах Win7, Vista, Win XP. Описание и работа популярных программ. Безопасность ПК. Советы не переполнены терминологией и доступны для повторения даже начинающему пользователю.

Приветствие

Страницы

четверг, 21 апреля 2011 г.

Добавляем в контекстное меню пункт «Удалить содержимое папки»

Бывают ситуации, когда требуется удалить содержимое папки, но саму папку оставить. Для этого нужно заходить в папку, выделять содержимое мышкой или сочетанием клавиш Ctrl+A, затем удалять, выбрав в контекстном меню «Удалить» или нажав клавишу Delete. Если часто приходится проделывать данные действия, можно упростить задачу, добавив в контекстное меню пункт «Удалить содержимое папки». Для этого достаточно добавить в реестр несколько значений. И хотя добиться этого можно несколькими способами, рассмотрим один, наиболее простой.
Откройте редактор реестра сочетанием клавиш Win+R, введите команду regedit и нажмите «ОК».

В окне редактора раскройте ветку реестра HKEY_CLASSES_ROOT,

затем Directory и shell. Наведите курсор на shell и, нажав правую клавишу мыши, выберете «Создать», «Раздел».

Введите имя раздела — « Удалить содержимое папки» и нажмите «Enter». В созданном разделе вновь создайте подраздел, но уже с именем «command».

В правой части окна редактора дважды щелкните по значению параметра «(По умолчанию)»,

раздела command и в открывшемся окошке введите значение-
cmd.exe /c «cd /d %1 && del /s /f /q *.*»

Закройте редактор реестра. Теперь, когда наведете курсор мышки на папку и нажмете правую клавишу мыши, вызывая контекстное меню, увидите пункт «Удалить содержимое папки».

Можно ли (и нужно ли) удалять содержимое папки TEMP?

Топ-10 смартфонов 2023 года: выбираем лучшее

В папке TEMP хранятся временные файлы, которые занимают немало места. Стоит ли их удалять, не случится ли чего страшного?

Можно ли (и нужно ли) удалять содержимое папки TEMP?

Одна из самых распространенных проблем, с которой сталкиваются начинающие пользователи — нехватка места в системном разделе. Под нужды Windows, как правило, выделяется немного места относительно других разделов, на которых хранятся игры и мультимедиа-файлы. Это приводит к тому, что операционная система начинает тормозить. Чтобы этого избежать, необходимо понимать, что именно съедает свободные гигабайты на системном разделе.

Где находится папка «Temp» и для чего она нужна

Одни из самых прожорливых потребителей дискового пространства — временные файлы. Они регулярно создаются в процессе работы операционной системы и за годы способны разрастись до десятков гигабайт. Место их обитания — системная папка «Temp». В ней хранятся некоторые данные, которые создаются в ходе манипуляций с операционной системой или различными программами. Нужна эта папка для того, чтобы экономить время пользователя, а также оперативную память, которой всегда не хватает. То есть временные файлы — это результаты определенных вычислений, которые могут потребоваться при повторном выполнении операции. Большинство из этих файлов удаляются автоматически при завершении операции, но никто не отменял системные сбои или экстренное выключение компьютера. Поэтому периодически необходимо избавляться от временных файлов.

Найти папку с временными файлами можно по адресу: C:\Windows\Temp. Однако, по умолчанию она скрыта от глаз пользователя.

Для того, чтобы обнаружить папку «Temp», нужно сделать скрытые файлы видимыми.

  • Нажмите комбинацию клавиш на клавиатуре Win + R и в появившемся окне введите команду «control».
  • Далее в правом верхнем углу выберите «Просмотр: Мелкие значки».
  • Найдите пункт «Параметры Проводника».
  • Пролистайте вторую вкладку «Вид» и выберите пункт «Показывать скрытые файлы, папки и диски».

В Windows 7 искомая папка находится по адресу: C:\Users\Имя учетной записи\AppData\Local\Temp

Как очистить папку «Temp»

Можно воспользоваться одним из трех способов.

  • Вручную удалить все содержимое. Для этого просто зайдите в папку и выделите все файлы, нажав комбинацию клавиш Ctrl + A. Затем с помощью комбинации Shift + Del безвозвратно сотрите все выбранные файлы.
  • Воспользоваться встроенными в операционную систему средствами. Зайдите в «Этот компьютер» и нажмите правой кнопкой мыши по системному разделу. Выберите пункт «Свойства», а затем утилиту «Очистка диска». В зависимости от объемов накопленного мусора и скорости жесткого диска, время запуска может варьироваться от пары секунд до нескольких минут. Те файлы, напротив которых будут стоять галочки можно смело удалять. Кроме того, по своему усмотрению вы можете очистить файлы загрузок, корзины и другие. Однако, временные данные, хранящиеся в папке «Temp», и которые сейчас не используются системой и программами — находятся под соответствующим пунктом «Временные файлы» (кто бы мог подумать). Поставьте нужные галочки и подтвердите операцию.
  • Сторонний софт. Наверное, каждый уже слышал о популярной программе CCleaner, которая может не только избавить компьютер от системного мусора, а также: оптимизировать работу реестра, настроить автозагрузку, найти дубликаты файлов и многое другое. Это именно тот инструмент, который должен быть установлен у каждого пользователя. Утилита не ест много системных ресурсов, полностью поддерживает русский язык и находится в бесплатном доступе. В общем, must have. Качаем здесь.

Нюансы и рекомендации

Если во время удаления система выдает уведомление об ошибке, пропустите файлы, на которые ОС ругается. Такое происходит из-за того, что некоторые временные данные используются непосредственно сейчас, и удалить их не получится. Если вы посмотрите объем папки «Temp» и сравните его с объемом временных файлов в утилите «Очистка диска», то обратите, что в программе он немного меньше. Это как раз связано с данными, используемыми в реальном времени. Windows их не учитывает.

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

Читайте также:

  • Как исправить ошибку обновления Windows 10: практические советы
  • Есть ли смысл дефрагментировать SSD?

Так как же удалить миллионы файлов из одной папки?

Феерическая расстановка точек над i в вопросе удаления файлов из переполненной директории.

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

Для тех, кто не в курсе проблемы, краткое описание: если вы случайно создали в одной директории огромное количество файлов без иерархии — т.е. от 5 млн файлов, лежащих в одной единственной плоской директории, то быстро удалить их не получится. Кроме того, не все утилиты в linux могут это сделать в принципе — либо будут сильно нагружать процессор/HDD, либо займут очень много памяти.

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

Подготовка

Так как создавать переполненную директорию на своём HDD рабочего компьютера, потом мучиться с её удалением ну никак не хочется, создадим виртуальную ФС в отдельном файле и примонтируем её через loop-устройство. К счастью, в Linux с этим всё просто.

Создаём пустой файл размером 200Гб

#!python f = open("sparse", "w") f.seek(1024 * 1024 * 1024 * 200) f.write("\0") 

Многие советуют использовать для этого утилиту dd, например dd if=/dev/zero of=disk-image bs=1M count=1M , но это работает несравнимо медленнее, а результат, как я понимаю, одинаковый.

Форматируем файл в ext4 и монтируем его как файловую систему

mkfs -t ext4 -q sparse # TODO: less FS size, but change -N option sudo mount sparse /mnt mkdir /mnt/test_dir 

К сожалению, я узнал об опции -N команды mkfs.ext4 уже после экспериментов. Она позволяет увеличить лимит на количество inode на FS, не увеличивая размер файла образа. Но, с другой стороны, стандартные настройки — ближе к реальным условиям.

Создаем множество пустых файлов (будет работать несколько часов)

#!python for i in xrange(0, 13107300): f = open("/mnt/test_dir/___".format(i), "w") f.close() if i % 10000 == 0: print i 

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

Проверяем, что все айноды на ФС исчерпаны.

$ df -i /dev/loop0 13107200 13107200 38517 100% /mnt

Размер файла директории ~360Мб

$ ls -lh /mnt/ drwxrwxr-x 2 seriy seriy 358M нояб. 1 03:11 test_dir

Теперь попробуем удалить эту директорию со всем её содержимым различными способами.

Тесты

После каждого теста сбрасываем кеш файловой системы
sudo sh -c ‘sync && echo 1 > /proc/sys/vm/drop_caches’
для того чтобы не занять быстро всю память и сравнивать скорость удаления в одинаковых условиях.

Удаление через rm -r

$ rm -r /mnt/test_dir/
Под strace несколько раз подряд (. ) вызывает getdents() , затем очень много вызывает unlinkat() и так в цикле. Занял 30Мб RAM, не растет.
Удаляет содержимое успешно.

iotop 7664 be/4 seriy 72.70 M/s 0.00 B/s 0.00 % 93.15 % rm -r /mnt/test_dir/ 5919 be/0 root 80.77 M/s 16.48 M/s 0.00 % 80.68 % [loop0]

Т.е. удалять переполненные директории с помощью rm -r /путь/до/директории вполне нормально.

Удаление через rm ./*

$ rm /mnt/test_dir/*
Запускает дочерний процесс шелла, который дорос до 600Мб, прибил по ^C . Ничего не удалил.
Очевидно, что glob по звёздочке обрабатывается самим шеллом, накапливается в памяти и передается команде rm после того как считается директория целиком.

Удаление через find -exec

$ find /mnt/test_dir/ -type f -exec rm -v <> \;
Под strace вызывает только getdents() . процесс find вырос до 600Мб, прибил по ^C . Ничего не удалил.
find действует так же, как и * в шелле — сперва строит полный список в памяти.

Удаление через find -delete

$ find /mnt/test_dir/ -type f -delete
Вырос до 600Мб, прибил по ^C . Ничего не удалил.
Аналогично предыдущей команде. И это крайне удивительно! На эту команду я возлагал надежду изначально.

Удаление через ls -f и xargs

$ cd /mnt/test_dir/ ; ls -f . | xargs -n 100 rm
параметр -f говорит, что не нужно сортировать список файлов.
Создает такую иерархию процессов:

| - ls 212Кб | - xargs 108Кб | - rm 130Кб # pid у rm постоянно меняется

Удаляет успешно.

iotop # сильно скачет 5919 be/0 root 5.87 M/s 6.28 M/s 0.00 % 89.15 % [loop0]

ls -f в данной ситуации ведет себя адекватнее, чем find и не накапливает список файлов в памяти без необходимости. ls без параметров (как и find ) — считывает список файлов в память целиком. Очевидно, для сортировки. Но этот способ плох тем, что постоянно вызывает rm , чем создается дополнительный оверхед.
Из этого вытекает ещё один способ — можно вывод ls -f перенаправить в файл и затем удалить содержимое директории по этому списку.

Удаление через perl readdir

$ perl -e ‘chdir «/mnt/test_dir/» or die; opendir D, «.»; while ($n = readdir D) < unlink $n >‘ (взял здесь)
Под strace один раз вызывает getdents() , потом много раз unlink() и так в цикле. Занял 380Кб памяти, не растет.
Удаляет успешно.

iotop 7591 be/4 seriy 13.74 M/s 0.00 B/s 0.00 % 98.95 % perl -e chdi. 5919 be/0 root 11.18 M/s 1438.88 K/s 0.00 % 93.85 % [loop0]

Получается, что использование readdir вполне возможно?

Удаление через программу на C readdir + unlink
//file: cleandir.c #include #include #include int main(int argc, char *argv[]) < struct dirent *entry; DIR *dp; chdir("/mnt/test_dir"); dp = opendir("."); while( (entry = readdir(dp)) != NULL ) < if ( strcmp(entry->d_name, ".") && strcmp(entry->d_name, "..") )< unlink(entry->d_name); // maybe unlinkat ? > > > 

$ gcc -o cleandir cleandir.c
$ ./cleandir
Под strace один раз вызывает getdents() , потом много раз unlink() и так в цикле. Занял 128Кб памяти, не растет.
Удаляет успешно.

iotop: 7565 be/4 seriy 11.70 M/s 0.00 B/s 0.00 % 98.88 % ./cleandir 5919 be/0 root 12.97 M/s 1079.23 K/s 0.00 % 92.42 % [loop0]

Опять — же, убеждаемся, что использовать readdir — вполне нормально, если не накапливать результаты в памяти, а удалять файлы сразу.

Выводы
  • Использовать комбинацию функций readdir() + unlink() для удаления директорий, содержащих миллионы файлов, можно.
  • На практике лучше использовать rm -r /my/dir/ , т.к. он поступает более умно — сперва строит относительно небольшой список файлов в памяти, вызывая несколько раз readdir() , а затем удаляет файлы по этому списку. Это позволяет более плавно чередовать нагрузку на чтение и запись, чем повышает скорость удаления.
  • Для снижения нагрузки на систему использовать в комбинации с nice или ionice . Либо использовать скриптовые языки и вставлять небольшие sleep() в циклах. Либо генерировать список файлов через ls -l и пропускать его через замедляющий пайп.
  • Не верить всему, что пишут в интернетах, конечно же! В различных блогах часто обсуждают эту проблему, и регулярно подсказывают неработающие решения.
  • Настройка Linux
  • Системное администрирование
  • *nix

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *