5

У меня возникли некоторые проблемы с этой командой под Bash в Ubuntu:

rm $(find . -name "*.exe")

Моя цель - рекурсивно удалить все файлы, заканчивающиеся на .exe . Но некоторые файлы имеют пробелы, и это нарушает команду.

Любые предложения о том, как подойти к этой проблеме?

4 ответа4

16
find . -name "*.exe" -exec rm -f '{}' +

Он find формат команды и аргументы и тщательно избегает искажения имен (передавая каждый как отдельный аргумент в rm). «+» Означает «делать столько, сколько вы можете, разумно за одно выполнение rm ».

3

Вы можете направить вывод из find в xargs , указав, что только разделители должны рассматриваться как разделители между именами файлов:

find -name '*.exe' | xargs -d \\n rm

Более переносимый способ сделать это - использовать нулевой символ в качестве разделителя:

find -name '*.exe' -print0 | xargs -0 /bin/rm

Смотрите man-страницу find для примера, который делает это.

Другой вариант - использовать команду, которую вы использовали, но установить внутренний разделитель аргументов bash только на новые строки:

IFS=$'\n'; rm $(find . -name "*.exe");

Здесь конструкция цитирования $'...' используется для создания символа новой строки. Этот подход будет менее устойчивым в случае длинного списка имен файлов, чем при использовании xargs .

1

Просто передайте опцию -delete чтобы find:

find . -name "*.exe" -delete

Это избавляет вас от цитирования и любых других проблем с именами файлов и, по-видимому, быстрее, чем -exec потому что не нужно запускать новые процессы.

0

Вам может помочь экранирование персонажей вручную.

find . -name "*.exe" | sed -s 's/\ /\\ /' | xargs rm -f

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