Удалить все файлы, заканчивающиеся с определенной строкой

Я написал пост в блоге, на который вы дали ссылку. Вы когда-нибудь загружали систему из uboot, который вы записали на SD-карту?

Причина в том, что на SD-карту не записано окружение, пока вы не запустите saveenv. Пока вы не запустили saveenv, u-boot будет использовать внутренние значения по умолчанию, встроенные в двоичный файл u-boot.

2
10.07.2018, 19:25
4 ответа

В последних версиях 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}для создания списка файлов, которые вам нужны.

4
27.01.2020, 21:50

Использование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делают следующее:

  1. Выберите только те, которые соответствуют scene*.png.
  2. Отфильтровать (удалить из выбора )имена файлов в диапазоне от 000000.pngдо 000099.png.
  3. Отфильтровать имена файлов в диапазоне от 000100.pngдо 000149.png.
  4. Отфильтровать имена файлов, оканчивающиеся на 000150.png.

... затем удалите файл, если он все еще рассматривается. 2-й, 3-й и 4-й -nameтесты отменяются, чтобы предотвратить findудаление этих файлов, (это те, которые мы хотели бы сохранить ).

Имена удаленных файлов также будут напечатаны до фактического удаления.

Я предлагаю сначала запустить это с удаленным -delete.

4
27.01.2020, 21:50

В zsh, конструкция <m-n>сопоставляет строки, которые являются числами от m до n. Оба являются необязательными. Таким образом:

rm scene<->_<151->.png

(вы также можете начать подстановочный знак с scene*_, но <->будет защитой от *сопоставления чего-то непреднамеренного, если есть файлы, названные в соответствии с другим шаблоном)

2
27.01.2020, 21:50

Может быть, скриптик:

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
0
27.01.2020, 21:50

Теги

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