Как я могу рекурсивно удалять файлы, содержащие пробелы?

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

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

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

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

4 ответа

Решение
find . -name "*.exe" -exec rm -f '{}' +

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

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

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

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

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

Увидеть find Страница man для примера, который делает это.

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

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

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

Просто передать -delete возможность find:

find . -name "*.exe" -delete

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

Ручная экранизация персонажей может вам помочь.

find . -name "*.exe" | sed -s 's/\ /\\ /' | xargs rm -f
Другие вопросы по тегам