Я написал пост в блоге, на который вы дали ссылку. Вы когда-нибудь загружали систему из uboot, который вы записали на SD-карту?
Причина в том, что на SD-карту не записано окружение, пока вы не запустите saveenv. Пока вы не запустили saveenv, u-boot будет использовать внутренние значения по умолчанию, встроенные в двоичный файл u-boot.
В последних версиях bash для этого можно использовать раскрытие фигурных скобок:
rm scene*_{000151..000300}.png
Расширение фигурных скобок в Bash имеет дело с начальными нулями:
$ echo {000000..000005}.png
000000.png 000001.png 000002.png 000003.png 000004.png 000005.png
Таким образом, вы можете использовать {000151..000300}
для создания списка файлов, которые вам нужны.
Использованиеfind
:
find. -maxdepth 1 -type f \
-name 'scene*.png' \
! -name '*_0000[0-9][0-9].png' \
! -name '*_0001[0-4][0-9].png' \
! -name '*_000150.png' -print -delete
Это найдет все файлы, которые вы хотите удалить в текущем каталоге (только ).
Различные флаги -name
делают следующее:
scene*.png
. 000000.png
до 000099.png
. 000100.png
до 000149.png
. 000150.png
. ... затем удалите файл, если он все еще рассматривается. 2-й, 3-й и 4-й -name
тесты отменяются, чтобы предотвратить find
удаление этих файлов, (это те, которые мы хотели бы сохранить ).
Имена удаленных файлов также будут напечатаны до фактического удаления.
Я предлагаю сначала запустить это с удаленным -delete
.
В zsh, конструкция <m-n>
сопоставляет строки, которые являются числами от m до n. Оба являются необязательными. Таким образом:
rm scene<->_<151->.png
(вы также можете начать подстановочный знак с scene*_
, но <->
будет защитой от *
сопоставления чего-то непреднамеренного, если есть файлы, названные в соответствии с другим шаблоном)
Может быть, скриптик:
echo '#!/bin/bash
# Test argument
if [ $# = 1 ]; then
if [ -d $1 ]; then
cd $1
else
echo "$1 is not a directory" >&2
exit 1
fi
fi
declare f # filname
declare -i fc # file counter
declare -i fcs # file conter for a scene
declare sn # scene number
declare csn # current scene number
declare -i dfc # delete file counter
declare -i pfc # preserve file counter
# Open logfiles
exec file-delete>>&3
exec file-preserve>>&4
for f in *; do
((fc++))
sn=${f#scene}
sn=${sn%_*}
if [ "$sn" = "$csn" ]; then
((fcs++))
else
# New number scene
fcs=1
csn=$sn
dfc=0
pfc=0
echo
fi
if ((fcs > 150));then
# Candidate for deleting
echo "$f" >>&3
((dfc++))
else
# Preserve file
echo "$f" >>&4
((pfc++))
fi
# Display in console
echo -en "\r scene $csn preserve:$pfc delete:$dfc"
done
echo
# Closing logfile
exec 3>&-
exec 4>&-
echo "Files scaned : $fc"
wc -l file-delete
wc -l file-preserve
' > ~/scanfile
Для запуска:
bash ~/scanfile [<pathdir>]
Если опущено, работает в текущем каталоге.
Он ничего не удаляет, он записывает два файла в сканируемом каталоге (файл -удалить и файл -сохранить ).
После проверки удаляемые файлы можно перемещать с помощью:
[cd <pathdir>]
mkdir tmp
while read; do mv -v $REPLY tmp; done < file-delete
Если результат хороший, то
rm -rf tmp
rm file-delete file-preserve