Как я могу удалить файлы со странными именами из каталогов?

#linux #bash

Вопрос:

Учитывая файлы 0..9.txt в каталогах foo и bar , как я могу удалить те, которые являются нечетными?

Я придумал

 find . -regextype egrep -regex ".*[0-9].txt"  | while read file; do    [ `expr match "$file" '[0-9]'`% 2 -eq 0 ] amp;amp; rm -v "$file" ; done
 

Но это не работает. Я не понимаю, как правильно настроить поиск числа в полном имени файла и проверить его четность.

Комментарии:

1. Каковы примеры нескольких добавленных имен файлов?

2. анубхава, я думаю, что под «нечетным» ОП подразумевает нечетное число (в отличие от четного). Не странно в смысле необычного.

3. этого должно хватить ".*[13579].txt"

4. Кажется find . -name '*[13579].txt' , этого достаточно. Нет необходимости выполнять регулярное выражение.

5. Гораздо легче решать проблемы, если вы попытаетесь разбить их на части и вместо этого решить отдельные части. Если вы попробуете части вашего скрипта сами по себе, вы увидите, что expr match file42.txt '[0-9]' не выводится 42 и [ 2%2 -eq 0 ] amp;amp; echo "even" не выводится «даже».

Ответ №1:

 find . -name '*[13579].txt' -delete
 

Если вы find не поддерживаете -delete , используйте:

 find . -name '*[13579].txt' -exec rm {} ;
 

или

 find . -name '*[13579].txt' -exec rm {}  
 

Ответ №2:

 find . -regextype egrep -regex ".*[0-9].txt" |
  while read file; do 
    n=$(basename $file .txt); 
    if [[ $((n % 2)) == 1 ]]; then 
      rm -v $file; 
    fi; 
  done