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