Удалите все кроме нескольких расширений

Более следовало бы сказать, что Флэш-память имеет только ограниченное количество циклов стирания, они вызванные в конечном счете записями. Существует много хороших статей, доступных об этом различии.

Когда Вы упоминаете, что записали изображение Linux во встроенное микропрограммное обеспечение маршрутизатора, которое является, вероятно, флэш-памятью NOR или EEProm. NOR является типом флэш-памяти с более быстрыми чтениями, NAND тип с более быстрыми записями.

Под ext3 журнал является наиболее часто записанным файлом, и те записи в конечном счете заполнят блок, вызывая стирание другого блока. Установка большего commit= значение на монтировании собрало бы эти записи журнала в большие блоки.

Наконец, для повторения других решений, монтирующихся с noatime общепринятая практика, которая уменьшит влияние.

5
26.08.2015, 16:34
4 ответа

@ChrisDown дал a bash решение, которое принимает во внимание различие файлов и каталогов, и также если нет никакого файла для удаления.

Учитывая, что rm перестал бы работать однако в этих ситуациях, команда могла быть упрощена как (все еще с bash):

shopt -s extglob nocaseglob
rm -- !(*.bmp|*.wav|*.png)

Не забудьте сбрасывать две опции оболочки к их значениям по умолчанию. В моем случае extglob уже установлен на интерактивных оболочках, таким образом, мне только нужно

shopt -u nocaseglob

Или выполненный те две команды в подоболочке:

(shopt -s extglob nocaseglob
rm -- !(*.bmp|*.wav|*.png))

Если требуется видеть заранее, какие файлы будут удалены, просто займут место rm с echo.

Если Вы хотели бы, чтобы скрытые файлы были удалены также, добавьте dotglob опция.

11
27.01.2020, 20:31
  • 1
    @enzolib, который Это уже вне объема вопроса, но я использовал запятые вместо | и все из каталога было удалено (ничто важное, таким образом, я загрузил его снова), но я могу вообразить опасность этой команды. Есть ли некоторая менее серьезная команда с возможностью резервного копирования? –  xralf 28.12.2011, 12:49
  • 2
    @enzolib я вижу Вас, отредактировал вопрос, и Ваше последнее предложение очень полезно. –  xralf 28.12.2011, 12:51

Если Вы используете bash, можно использовать комбинацию extglob и nocaseglob.

shopt -s extglob nocaseglob
for file in !(@(*.bmp|*.wav|*.png)); do
    [[ -f "${file}" ]] && files+=( "${file}" )
done
(( ${#files[@]} )) && rm "${files[@]}"

Иначе Вы можете нас что-то как следующее:

find . -maxdepth 1 -type f ! \( -iname '*.bmp' -o -iname '*.wav' -o \
    -iname '*.png' \) -delete
5
27.01.2020, 20:31
  • 1
    исполнительная комната {} может быть заменена - удаляют –  akond 27.12.2011, 16:42
  • 2
    Спасибо за эту сложную команду. На самом деле я искал что-то более простое, чтобы смочь использовать его быстро, когда у меня есть потребность. Таким образом, решение enzolib более удобно для моих общих потребностей. –  xralf 27.12.2011, 19:16
  • 3
    @xralf имени пакета Принимает во внимание, что это не только удалит регулярные файлы, однако... –  Chris Down 27.12.2011, 22:37
  • 4
    @ChrisDown Это довольно странно, потому что я обычно должен использовать rm -r удалить каталоги. –  xralf 28.12.2011, 12:54
  • 5
    @xralf Это не только каталоги, которые не являются регулярными файлами. –  Chris Down 28.12.2011, 13:08

Я предложил бы, чтобы Вы заняли немного времени и сделали это на нескольких шагах, таким образом, Вы не делаете ничего случайно глупого.

  1. создайте команду для идентификации файлов, которые Вы хотите удалить, например.

        ls | grep -v *.bmp | grep -v *.wav  # current directory
    

    или

        find . -type f | grep -v *.bmp      # current and sub directories
    

    если список возвращенных файлов - то, что Вы хотите удалить, то

  2. повторно вызовите последнюю команду и добавьте xargs rm управляйте к нему, например.

        ls | grep -v *.bmp | grep -v *.wav | xargs rm
    
0
27.01.2020, 20:31
  • 1
    , который я не понимаю, почему Вы рассматриваете использование grep -v вместо findinbuild ! -iname немного более безопасный. Не говоря уже о том, что это не работает нечувствительным к регистру способом согласно просьбе в вопросе и повредится на новых строках. –  Chris Down 28.12.2011, 00:16
  • 2
    Не говоря уже о том, что grep -v *.bmp не имеет никакого смысла, Вы, вероятно, имели в виду grep -v '\.bmp$'. –  Stéphane Chazelas 26.08.2015, 17:02

С помощью zsh , чтобы удалить обычные файлы, кроме .bmp , .png , .wav (без учета регистра):

setopt extendedglob # best in ~/.zshrc
rm -- *.^(#i)(png|bmp|wav)(D.)

(удалите D выше, если вы хотите сохранить скрытые файлы независимо от их расширения).

3
27.01.2020, 20:31

Теги

Похожие вопросы