Использование 'rm -rf' в Linux PowerShell и Linux bash - PullRequest
1 голос
/ 08 мая 2020

Мне нужно выполнить "rm -rf" на удаленном компьютере под управлением Ubuntu, чтобы очистить указанную папку. Если я использую следующую команду, все идет нормально.

rm -rf "home/blahblah/blah"/*

Но если я запустил ту же команду в Linux PowerShell, я бы удалил ВСЕ файлы. Есть ли способ указать путь, который будет обрабатываться одинаково в bash и PS? Спасибо!

1 Ответ

3 голосов
/ 08 мая 2020

tl; dr

К сожалению, начиная с PowerShell 7.0, вы должны сделать следующее (если вы хотите использовать внешнюю утилиту rm):

sh -c "rm -rf 'home/blahblah/blah'/*"

Обратите внимание, что я переключился на одинарные кавычки ('...') вокруг пути, поэтому я могу использовать его внутри строки с двойными кавычками ("..."). Хотя обратное ('... "..."/*') должно работать как есть, в настоящее время для него требуется дополнительное экранирование ('... \"...\"/*') - см. этот ответ .

Однако, если путь, предшествующий /*, на самом деле не требует цитирования - особенно если он не содержит пробелов - вы можете просто позвонить:

rm -rf home/blahblah/blah/*

Вы видите очень досадную разницу между PowerShell (начиная с версии 7.0) и POSIX-подобными оболочками, такими как Bash, в отношении обработки строковых аргументов, состоящих как из цитируемых, так и из некотируемых частей.

PowerShell анализирует "home/blahblah/blah"/* как два аргумента:

  • home/blahblah/blah становится первым аргументом, как есть в этом случае.

  • /* интерпретируется как второй аргумент, который из-за того, что не заключен в кавычки и из-за вызова внешней утилиты , запускает эмуляцию PowerShell подстановки ( расширение имени файла) POSIX-подобных оболочек, что означает, что все файлы и d каталоги в каталоге root передаются как отдельные аргументы.

Следовательно, аргументы, которые фактически получает утилита rm, следующие: -rf, home/blahblah/blah , /bin, /boot, /dev, ... - что явно не является намерением.

Эта проблема c поведение обсуждается в этом выпуске GitHub .

Передача команды sh, оболочке по умолчанию на Unix -подобных платформах, вместо этого позволяет обойти проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...