Более следовало бы сказать, что Флэш-память имеет только ограниченное количество циклов стирания, они вызванные в конечном счете записями. Существует много хороших статей, доступных об этом различии.
Когда Вы упоминаете, что записали изображение Linux во встроенное микропрограммное обеспечение маршрутизатора, которое является, вероятно, флэш-памятью NOR или EEProm. NOR является типом флэш-памяти с более быстрыми чтениями, NAND тип с более быстрыми записями.
Под ext3 журнал является наиболее часто записанным файлом, и те записи в конечном счете заполнят блок, вызывая стирание другого блока. Установка большего commit=
значение на монтировании собрало бы эти записи журнала в большие блоки.
Наконец, для повторения других решений, монтирующихся с noatime
общепринятая практика, которая уменьшит влияние.
@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
опция.
Если Вы используете 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
rm -r
удалить каталоги.
– xralf
28.12.2011, 12:54
Я предложил бы, чтобы Вы заняли немного времени и сделали это на нескольких шагах, таким образом, Вы не делаете ничего случайно глупого.
создайте команду для идентификации файлов, которые Вы хотите удалить, например.
ls | grep -v *.bmp | grep -v *.wav # current directory
или
find . -type f | grep -v *.bmp # current and sub directories
если список возвращенных файлов - то, что Вы хотите удалить, то
повторно вызовите последнюю команду и добавьте xargs rm
управляйте к нему, например.
ls | grep -v *.bmp | grep -v *.wav | xargs rm
grep -v
вместо find
inbuild ! -iname
немного более безопасный. Не говоря уже о том, что это не работает нечувствительным к регистру способом согласно просьбе в вопросе и повредится на новых строках.
– Chris Down
28.12.2011, 00:16
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
выше, если вы хотите сохранить скрытые файлы независимо от их расширения).
|
и все из каталога было удалено (ничто важное, таким образом, я загрузил его снова), но я могу вообразить опасность этой команды. Есть ли некоторая менее серьезная команда с возможностью резервного копирования? – xralf 28.12.2011, 12:49