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