11

Я пытаюсь удалить кучу файлов в определенном каталоге (в Mac OS X с помощью терминала)

ls | grep \([1-9]\) | xargs rm

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

> rm: 520syllabus2010: No such file or
> directory rm: (3).pdf: No such file or
> directory

потому что это не интерпретирует пространство правильно. Следует удалить «520syllabus2010 (3).pdf»

Как правильно это сделать?

Спасибо джефф

1 ответ1

19

Укороченная версия:

rm *\([1-9]\)*

Не передавайте ls к xargs . Вместо этого труба find ... -print0 в xargs -0 , чтобы избежать таких проблем.

find . -maxdepth 1 -name '*([1-9])*' -print0 | xargs -0 rm

... который можно записать как:

find . -maxdepth 1 -name '*([1-9])*' -exec rm {} \;

а также:

find . -maxdepth 1 -name '*([1-9])*' -delete

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


Обычно, ls и find отдельные имена файлов с символами новой строки, но xargs разделяет их ввод по символам новой строки или пробела, что приводит к поведению, которое вы видите.

Можно указать xargs разделять только по новой строке , но в файлах также могут быть новые строки. На самом деле, в Linux и BSD единственным запрещенным символом является "нулевой" или нулевой байт - так что это то, что вы должны использовать в таких случаях.

В приведенном выше примере 2 -print0 указывает find разделять имена файлов нулевым байтом; то же самое для xargs -0 . (Несколько других инструментов также имеют аналогичные параметры, такие как sort -z или grep -zZ .)

"Короткая версия" использует простой подстановочный знак оболочки ("pattern" в руководстве по bash - см. Раздел "Расширение пути").

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .