Я пытаюсь удалить кучу файлов в определенном каталоге (в 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»
Как правильно это сделать?
Спасибо джефф
#
.#
.(3)
. Лучше процитировать аргументы, чтобы оболочка не влияла на них.Ответы:
Укороченная версия:
Не труба
ls
кxargs
. Вместо этого, трубыfind ... -print0
дляxargs -0
того, чтобы избежать таких проблем.... который можно записать как:
и:
который может быть сокращен до
rm
подстановочного знака.Обычно,
ls
иfind
разделяют имена файлов с помощью новых строк, ноxargs
разделяет его ввод по новой строке или пробелу, что приводит к поведению, которое вы видите.Можно
xargs
разделить только по новой строке, но в именах файлов также могут быть новые строки. На самом деле, в Linux и BSD единственным запрещенным символом является «нулевой» или нулевой байт - так что это то, что вы должны использовать в таких случаях.В приведенном выше примере 2
-print0
указываетfind
разделять имена файлов нулевым байтом; то же самое дляxargs -0
. (Несколько других инструментов также имеют похожие параметры, такие какsort -z
илиgrep -zZ
.)«Короткая версия» использует простой подстановочный знак оболочки («шаблон» в
bash
руководстве - см. Раздел «Расширение пути»).источник
*" "\\([1-9]\\).*
так, чтобы удалялись только файлы с пробелом перед номером паренса перед (a, если честно) периодом.