Укороченная версия:
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
- см. Раздел "Расширение пути").