Я хотел бы найти и удалить все файлы из папки и ее подпапок с определенным свойством: они не имеют трехбуквенного суффикса. Как ты это делаешь? Благодарю.
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 для каждого файла.
Используйте это в правильной папке. В противном случае замените . с фамилией.
