Как я могу рекурсивно удалять файлы, содержащие пробелы?
У меня возникли некоторые проблемы с этой командой под 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