Я хотел бы найти и удалить все файлы из папки и ее подпапок с определенным свойством: они не имеют трехбуквенного суффикса. Как ты это делаешь? Благодарю.
3 ответа
TL; DR; (что очень плохо при автоматическом удалении материала)
find . ! -name "*.???" -type f -max-depth 1 -delete
Правильно объяснено и проверено:
Шаг 0: Настройка тестовой среды:
mkdir test
cd test
touch test1
touch test1.bar
touch test1.foo
touch test1.baz
touch test1.bazar
Шаг 1: Найдите все файлы с трехбуквенным расширением:
find . -name "*.???" -type f -print
./test1.bar
./test1.baz
./test1.foo
Шаг 2: инвертирование выбора
find . ! -name "*.???" -type f -print
./test1
./test1.bazar
Шаг 3: Замените -print
на -delete
.
Если вы не хотите погружаться в подкаталоги, добавьте -max-depth=1
Предполагая, что у вас есть версия bash 4+ (вы можете проверить с помощью bash --version
)
shopt -s extglob ## turn on extended globbing
rm -- !(*.???)
Для рекурсивности:
shopt -s extglob globstar
rm -- **/!(*.???)
В целом, я бы порекомендовал поместить эту строку в ваш .bashrc, так как расширенные globbing и globstar действительно полезны:
shopt -s extglob globstar
Вы можете попробовать find
.
Используйте это, чтобы сначала показать их, чтобы убедиться, что вы получаете правильные файлы:
find . -type f ! -name "*.???"
Если вы уверены, что хотите удалить их, вы можете использовать:
find . -type f ! -name "*.???" -print0 | xargs -0 rm -rfv
или, если вы предпочитаете путь -exec
:
find . -type f ! -name "*.???" -exec rm -rfv {} +
примечание: {} +
работает только с определенной версией и выше (обратитесь к руководству man find
разделе -exec
второй абзац. В противном случае вы можете использовать -exec -rfv {} \;
но это дает много накладных расходов, выполняя rm
для каждого файла.
Используйте это в правильной папке. В противном случае замените .
с фамилией.