не могу удалить свой вопрос, вместо этого перезаписать

2 ответа2

1

Хорошо, давайте делать это постепенно.

И давайте предположим , что вы действительно хотите выглядеть в подкаталогах , а также, несмотря на то, что это только подразумевается в вашем вопросе.

В качестве первого прохода это просто простое упражнение: передать подстановочный знак в команду find , не забывая процитировать его в кавычках и выполнить команду rm для каждого найденного файла:

find $BASE_DIR/ -name '* *' -exec rm {} \;

Но, конечно, это ужасно неэффективно. Он запускает целый процесс rm для каждого отдельного файла. Поэтому, хотя мы могли бы сделать короткий обход \+ , это не то место, где мы собираемся в конечном итоге, поэтому давайте выберем более короткий путь и xargs чтобы объединить имена файлов в группы:

find $BASE_DIR/ -name '* *' -print | xargs rm

Но у этого есть две дыры в безопасности. Во-первых, если любое найденное имя файла начинается со знака минус, rm будет рассматривать его как параметр командной строки, а не как имя файла, и выдаст ошибку. (Версия -exec rm {} также имеет эту проблему.) Во- вторых , как вы заметили, xargs не будет правильно обрабатывать имена файлов, содержащие пробелы. Таким образом, дальнейшая итерация должна сделать это немного более пуленепробиваемым:

find $BASE_DIR/ -name '* *' -print0 | xargs -0 rm --

И, конечно же, есть интерактивные функции rm которые вам, вероятно, не нужны:

find $BASE_DIR/ -name '* *' -print0 | xargs -0 rm -f --

-print0 и -0 не являются стандартными, но GNU find и xargs , а также FreeBSD find и xargs понимают их. Однако даже это немыслимо. Нам не нужно создавать никаких дополнительных процессов вообще. GNU и FreeBSD find s оба могут вызвать unlink(2) системный вызов напрямую:

find $BASE_DIR/ -name '* *' -delete

В качестве последней меры предосторожности, которая помешает вам делать больше, чем вы предполагали в определенных обстоятельствах, помните, что файловая система может содержать не только обычные файлы:

find $BASE_DIR/ -name '* *' -type f -delete
0

Что случилось с

rm *\ *

или же

rm *' '*

или же

rm *" "*

Вы можете попробовать «ls» перед «rm», чтобы быть уверенным в том, что вы делаете.

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