Windows, еквівалентна команді `rmdir *` UNIX


0

У системі * NIX можна легко вводити rmdir * , щоб видалити всі порожні каталоги .. rmdir скаржиться на непорожні каталоги і не видаляє їх.

В основному, якщо у вас є дерево, подібне до цього:

/
  d0/
    file
  d1/
    d0/
  d2/
  d3/

Потім працює rmdir * зсередини / призведе до d2/ і d3/ видаляється. d0/ і d1/ буде залишено наодинці з відлученою помилкою про те, що вони не є порожніми, щоб запобігти втраті вмісту в підвішеному стані.

/
  d0/
    file
  d1/
    d0/

Я не зміг знайти Windows, еквівалентний цьому. Найближча річ rmdir /s ., що еквівалентно rm -r ., крім того, що він відмовляється видаляти . тому що оболонка використовує його. Не впенений що rm -r . також відмовляється видаляти .. Не перевірили цього.

Подібно * NIX rmdir, Windows rmdir відмовиться видаляти одну директорію, якщо вона не є порожньою. Однак, схоже, не існує підстановочного селектора, як типовий *, що дивно, тому що маркер може бути використаний в іншому місці.

Це така річ, яка засмучує мене командним рядком Windows. Якщо у мене є 4000 каталогів, rmdir Очевидно, що кожен окремий каталог явно не є нормальним. Має бути кращий спосіб.

Я спробував побудувати a for оператор відповідно до синтаксису в довідці про використання ( for /? )

FOR %variable IN (set) DO command [command-parameters]

...отримати...

for %f in * do rmdir %f

і кілька варіантів цього (наприклад, зміна другого %f до %f%, все-cap'ing синтаксис, хоча я знаю, що це нечутливий до регістру, оточуючих * з parens, et al). Жоден з яких не працював. Невдала помилка з незрозумілими та непотрібними помилками, такими як:

%f was unexpected at this time.
* was unexpected at this time.

(Примітка. Я намагаюся це зробити в інтерактивному рядку, а не в сценарії)

Або у випадку з (*) варіант ...

>for %f in (*) do rmdir %f
>rmdir file
The directory name is invalid.
>dir
 Volume in blah blah blah

 Directory of blah

 blah blah    <DIR>          .
 blah blah    <DIR>          ..
 blah blah    <DIR>          nonemptydir
 blah blah    <DIR>          emptydir
 blah blah                 1 file
     1 File(s)             1 bytes
     4 Dir(s)    huge number bytes free

... вона навіть не торкається каталогів.

Я не розумію, чому це буде робити. Я слідував синтаксису, як описано в довідці.

Powershell не є можливим. Я повинен мати можливість робити це в оболонці, яка гарантовано буде встановлена, тобто cmd.exe. Джефф Цейтлін повідомив мені, що Powershell гарантовано є> Windows 7 . Однак, cmd.exe досі є кращим.


Для Windows 7 і пізніших версій, або Windows Server 2008R2 або пізнішої версії, PowerShell є гарантовано встановлено - Windows 7 поставляється з PowerShell 2; Windows 8 поставляється з PowerShell 3, Windows 8.1 поставляється з PowerShell 4, а Windows 10 поставляється з PowerShell 5. Відповідні версії Windows Server постачаються з відповідними версіями PowerShell. Для вашого for Я рекомендую вам зробити закладку ss64.com/nt як відмінне посилання cmd. Зокрема, в for %i in (*) do ..., дужки є обов'язковими.
Jeff Zeitlin

Яку версію Windows? Якщо у вас є Windows 10, ви могли б у теорії буквально використовувати цю команду, якщо ви використовуєте WSL.
Ramhound

@JeffZeitlin добре, не допомагає, якщо я знаходжу себе на вікні Windows XP, але я відступаю. for %f in (*) do rmdir %f Це одна з невдалих варіантів, які я спробував. У мене є тестовий каталог з порожнім каталогом, непустою директорією і звичайним файлом без розширення. Це відлуння rmdir file, а потім дає помилку The directory name is invalid.. Жодні каталоги не видаляються. Здається, відмовитися від помилки
Braden Best

Я здивований на цій пізній даті що там будь-який XP досі лишав навколо, але OK. Що стосується for заяву, я знову звертаюся до SS64, зокрема SS64 на FOR для папок . Зверніть увагу, що Winbatch є розвивається мовою навіть сьогодні; Вам дійсно потрібно знайти посилання, яке є специфічним для XP, якщо ви дійсно повинні його підтримувати.
Jeff Zeitlin

@JeffZeitlin TBH, я не очікую, щоб зіткнутися з машиною XP. Тільки я даю вам важкий час. У будь-якому випадку, я подивився на посилання, яке ви зв'язали. Ви повинні опублікувати його як відповідь. Що для мене працювало for /d %d in (*) do rmdir %d, який видаляє порожній каталог, ігнорує файл і залишає непорожній каталог самостійно, точно як * NIX rmdir * робить.
Braden Best

Відповіді:


2

Ваш FOR Заява хоче /D перемикач: FOR /D %I in (*) do .... Це призводить до того, що файли будуть пропущені повністю, і оброблятимуться лише папки (каталоги). З RMDIR/RD не буде видалено непустуючий каталог, це, здається, те, що ви хочете; Зауважте, що різні версії Windows можуть по-різному реагувати на помилку при спробі видалити непорожній каталог.

Список літератури: SS64 on FOR і FOR /D (FOR для папок)


Там ми йдемо. Це мідно-цинкова куля, яку я шукав.
Braden Best

1
FWIW, це один з небагатьох випадків, де я зіткнувся, де CMD рішення було насправді краще / простіше, ніж рішення PowerShell.
Jeff Zeitlin

2

%f на цей час несподівано. * на цей час несподівано.

for %f in * do rmdir %f

При використанні всередині пакетного файлу потрібно подвоїти % s.

The набір Ви називаєте це вираз в дужках. Дужки є ні необов'язково.

Виправлено командний рядок:

for %f in (*) do rmdir %f

Правильний пакетний файл:

for %%f in (*) do rmdir %%f

Це задокументовано в онлайн-довідці:

> for /?
Runs a specified command for each file in a set of files.

FOR %variable IN (set) DO command [command-parameters]

  %variable  Specifies a single letter replaceable parameter.
  (set)      Specifies a set of one or more files.  Wildcards may be used.
  command    Specifies the command to carry out for each file.
  command-parameters
             Specifies parameters or switches for the specified command.

To use the FOR command in a batch program, specify %%variable instead
of %variable.  Variable names are case sensitive, so %i is different
from %I.

І в для :

Якщо ви використовуєте команду FOR в командному рядку, а не в пакетній програмі, використовуйте лише один знак відсотка: %G замість %%G.

Параметри FOR

Перший параметр повинен бути визначений за допомогою одного символу, наприклад, літера G.

FOR %%G IN ...


Я ціную інформацію про for, але це не відповідає на запитання.
Braden Best
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.