массовое удаление файлов в windows

<p>у меня есть каталог, который содержит ~ 3 миллиона файлов в определенных подкаталогах на сервере windows 2008. удаление файлов вручную с помощью клавиш shift + del в корневом каталоге занимает много времени. есть ли другой способ сделать удаление в<strong> быстрее </strong>способом?</p>

<p>мне регулярно нужно удалять множество файлов и каталогов с зашифрованного диска winxp, обычно около 22 гб из 500 000 файлов в 45 000 папок.</p><p>удаление с помощью проводника windows - это чушь, потому что перечисление файлов тратит много времени. я обычно перемещаю материал, который мне нужно удалить, в c:\stufftodelete и имею пакетный файл deletestuff.bat в <code>rmdir /s/q c:\stufftodelete</code>. запуск запланирован на ночь, но иногда мне нужно запускать его днем, поэтому чем быстрее, тем лучше.</p><p>вот результаты теста quick time небольшого 5,85 мб образца из 960 файлов в 303 папках. я запустил метод 1, затем метод 2, а затем сбросил тестовые каталоги.</p><p>метод 1 удаляет файлы и структуру каталогов за один проход:</p><pre><code>rmdir /s/q foldername </code></pre><p>метод 2 имеет первый проход для удаления файлов и выводит значение nul, чтобы избежать накладных расходов при записи на экран для каждого отдельного файла. второй проход очищает оставшуюся структуру каталогов:</p><pre><code>del /f/s/q foldername > nul rmdir /s/q foldername </code></pre><ul> <li>метод 1: 17,5 с, 14,9 с, 13,9 с, 14,8 с, 13,8 с: среднее<strong> 14,98 с </strong></li> <li>метод 2: 14,3 с, 12,1 с, 11,7 с, 14,2 с, 11,8 с: среднее<strong> 12,82 с </strong></li> </ul><p>вот результаты другого теста с использованием 404 мб из 19 521 файла в 3243 папках:</p><ul> <li>способ 1:<strong> 2 минуты 20 секунд </strong></li> <li>способ 2:<strong> 2 минуты 33 секунды </strong></li> </ul><p>так что в этом не так много, вероятно, слишком близко, чтобы судить об одном тесте.</p><hr><p>правка: я еще раз проверил с гораздо большим количеством данных, это типичный случай для меня: 28,3 гб из 1159 211 файлов в 146 918 папках:</p><ul> <li>метод 1: 2 ч 15 м, 2 ч 34 м: в среднем:<strong> 2 часа 25 минут </strong></li> <li>метод 2: 49 м, 57 м: в среднем:<strong> 53 минуты </strong></li> </ul><p>вау, метод 2 почти в три раза быстрее, чем метод 1! я буду обновлять мой deletestuff.bat!</p>

<p>если вам приходится регулярно удалять большие деревья каталогов, рассмотрите возможность хранения корня этого дерева каталогов в отдельном разделе, а затем просто быстро отформатируйте его, когда вам нужно все удалить. если вам нужно автоматизировать это, вы можете использовать эту команду dos:</p><pre><code>echo y | format z: /fs:ntfs /x /q </code></pre><p>где z: ваш «изменчивый» раздел. примечание: раздел не должен иметь метки. я писал об этом <a href="http://zornsoftware.talsit.info/blog/fastest-way-to-delete-a-directory-tree-in-windows.html">здесь</a> .</p>

<p>в командной строке (пуск -> выполнить -> <code>cmd</code>):</p><pre><code>del /f /s /q foldername </code></pre>

<p>в дополнение к очень быстрому копированию/перемещению файлов (используя собственный api), teracopy может удалять файлы, и это тоже очень быстро. с тех пор, как я обнаружил teracopy, я не использую компьютер без установленного (если я собираюсь скопировать/переместить/удалить).</p><p>тот же установщик устанавливает версию x64, но для ее использования необходимо принудительно ее принудительно установить.</p><p>бета-версия, которую я рекомендую для стабильных версий: <a href="http://blog.codesector.com/2010/09/22/teracopy-2-2-beta-3/">http://blog.codesector.com/2010/09/22/teracopy-2-2-beta-3/</a> </p>

<p>я сделал файл летучей мыши, который делает то же самое.</p><pre><code>@echo off echo --------------------warning-------------------- echo folder "%~1" will be deleted echo --------------------warning-------------------- pause echo deleting folder: "%~1". time /t del /f/s/q "%~1" >nul rmdir /s/q "%~1" >nul echo done. time /t echo --- taking ownership. takeown /f "%~1" /r /d y >nul icacls "%~1" /reset /t >nul icacls "%~1" /setowner "%username%" /t >nul echo done all. time /t </code></pre><p>он выполняет работу в два этапа, один, он пытается удалить файлы. и второе - попытаться завладеть файлами.<strong> y </strong>должен быть изменен в соответствии с вашим местным населением (на английском означает «да»). если выполнить задачу не удалось (например, если произошел сбой из-за разрешения), вы должны запустить ее снова. тем не менее, второй раунд не будет пытаться удалить файлы, удаленные в первом раунде, поэтому это может быть довольно быстро.</p><hr><p>как это использовать. сохраните файл delfolder.bat в пути маршрута (например, c:\windows), затем запустите его как</p><pre><code> delfolder "foldername" </code></pre><p>где foldername - это имя папки</p><p>в моем тесте удаление 123'000 файлов заняло 3 минуты (sata 7200rpm). ура!</p>

<p>используйте команду <a href="http://technet.microsoft.com/en-us/library/cc726055(ws.10).aspx">rd/s</a> из командной строки.</p>

<p>использование кода ниже обычно работает хорошо для меня.</p><pre><code>mkdir empty\_dir robocopy empty\_dir dir\_to\_wipe /mir /r:0 /w:0 /e rmdir empty\_dir dir\_to\_wipe </code></pre>

<p>лучшее практическое решение, вероятно, состоит в том, чтобы убрать папку куда-нибудь (например, в корзину) и затем начать ее удаление. это займет целую вечность, но по крайней мере это будет в стороне.</p><p>я почти уверен, что время, необходимое для удаления всех этих файлов, является неотъемлемым требованием задачи, а не неэффективностью в реализации удаления.</p>

<p>установите <a href="http://cygwin.com">cygwin</a> и используйте<em> rm -r </em>. но это может быть излишним.</p>

<p>у вас включена генерация коротких имен файлов? если это так, вам это действительно нужно? удаление файла - только операция метаданных. так что если вам нужно удвоить количество имен для удаления, объем работы значительно выше.</p>

<p>вы пробовали любое из этих двух приложений?</p><ul> <li> <a href="http://www.objectmedia.ltd.uk/freesoftware/securedelete.html">безопасное удаление файла</a> </li> <li> <a href="http://www.objectmedia.ltd.uk/freesoftware/diskcopier.html">дисковый и файловый копир</a> </li> </ul><p>обязательно установите количество перезаписей равным 0, если вы хотите добиться максимальной производительности. сделайте это, щелкнув параметры, а затем измените значение в нижней части диалогового окна.</p><p>введите путь для удаления в поле «источник» и нажмите «удалить».</p><p>эти приложения не помещают файлы в корзину. используйте с осторожностью.</p>

<p>это сделано для того, чтобы дополнить и дополнить шаги, предпринятые в ранее упомянутых ответах.</p><p>приведенные выше два метода кажутся довольно эффективными, но определить производительность будет сложно, если они не будут сопоставлены с точно такими же условиями:</p><ul> <li>устройство и модель физического жесткого диска <ul> <li>предпочтительно, чтобы atto/crystal disk тестировались перед клонированием данных на них</li> </ul> </li> <li>одинаковое расположение раздела/тома и геометрия <ul> <li>способ сделать это - дефрагментировать образец раздела/папки и клонировать их точно так же, как они представляют собой два абсолютно одинаковых типа жестких дисков (из предыдущего шага)</li> </ul> </li> <li> <p>затем выполните настройки через пакетный файл и используйте командлет powershell для регистрации и измерения их производительности.</p> <ul> <li>в идеале добавьте некоторые механизмы, чтобы предотвратить любые ошибки кэширования из-за недавней активности схожей активности.</li> </ul> </li> <li> <p>ниже приведены примеры папок (названных как общий размер), над которыми я экспериментировал, но не смог получить каких-либо убедительных результатов/результатов.</p> </li> </ul><p><strong> р.бат </strong></p><blockquote> <pre><code>rmdir /s/q 3.2g </code></pre></blockquote><p><strong> rd.bat </strong></p><blockquote> <pre><code>del /f/s/q 3.3g > nul rmdir /s/q 3.3g </code></pre></blockquote><ul> <li>я бы опубликовал выходные файлы журнала, но я считаю, что разница огромна из-за размеров и распределения файлов папок и т.д.</li> </ul><p><strong> powershell: </strong></p><pre><code>ps s:\t> measure-command { s:\t\rd.bat } > rdlog.txt ps s:\t> measure-command { s:\t\r.bat } > rlog.txt ps s:\t> measure-command { s:\t\rd.bat } > rd\_1.7g\_log.txt ps s:\t> measure-command { s:\t\r.bat } > r\_1.8g\_log.txt ps s:\t> measure-command { s:\t\r.bat } > r\_2.4g\_log.txt ps s:\t> measure-command { s:\t\rd.bat } > rd\_2.7g\_log.txt ps s:\t> measure-command { s:\t\r.bat } > r\_3.2g\_log.txt ps s:\t> measure-command { s:\t\rd.bat } > rd\_3.3g\_log.txt </code></pre>

<p>ответ от <a href="https://superuser.com/questions/19762/mass-deleting-files-in-windows/289399#289399">hugo</a> самый быстрый, но он не удаляет скрытые или системные файлы при первом проходе, поэтому, если вы хотите более полное решение, используйте параметр/a:</p><pre><code>del /f /s /q /a foldername > nul rmdir /s /q foldername </code></pre><p>о файле bat от <a href="https://superuser.com/questions/19762/mass-deleting-files-in-windows/388047#388047">magallanes</a> , будьте очень осторожны с takeown и icacls, потому что жесткие ссылки имеют одинаковые разрешения и владельцев, поэтому, если есть <a href="http://schinagl.priv.at/nt/ln/ln.html">ненасыщенные жесткие ссылки</a> в папке, которую вы хотите удалить, используя takeown и icacls изменит разрешения и владельцев файлов вне папки.</p><p>с помощью инструмента <a href="http://schinagl.priv.at/nt/ln/ln.html">ln.exe</a> вы можете получить список всех файлов, жестко связанных внутри папки, и узнать, не связаны ли они с файлами вне папки (ненасыщенные жесткие ссылки):</p><pre><code>ln.exe --enum foldername > hardlinkslist.txt </code></pre>