Я хотел бы найти и удалить все файлы из папки и ее подпапок с определенным свойством: они не имеют трехбуквенного суффикса. Как ты это делаешь? Благодарю.

3 ответа3

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

2

Предполагая, что у вас есть версия bash 4+ (вы можете проверить с помощью bash --version)

shopt -s extglob  ##  turn on extended globbing
rm -- !(*.???)

Для рекурсивности:

shopt -s extglob globstar
rm -- **/!(*.???)

В целом, я бы порекомендовал поместить эту строку в ваш .bashrc, так как расширенные globbing и globstar действительно полезны:

shopt -s extglob globstar
1

Вы можете попробовать 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 для каждого файла.

Используйте это в правильной папке. В противном случае замените . с фамилией.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .