список файлов с такими же первыми тремя буквами, за которыми следует последовательность # с помощью сценария оболочки

Недавно я столкнулся с той же проблемой. (т.е. изначально у меня был отдельный раздел с установленной Ubuntu, двойная загрузка из меню grub. Затем я удалил этот раздел Ubuntu из управления дисками Windows, а когда я перезагрузился, просто меню команд grub).

Что я сделал, чтобы вернуться к Windows 10:

  1. Нажмите Ctrl + Alt + Delete для перезагрузки. Во время перезагрузки удерживайте кнопку shift.
  2. Затем мой компьютер дает мне возможность нажать F12 для загрузки. Я нажал F12 , и он возвращает мне меню с диспетчером загрузки Windows.
  3. Я выбрал диспетчер загрузки Windows и нажал Enter. Теперь я вернулся к Windows 10.
0
09.05.2017, 20:08
2 ответа

С zsh:

files=(???-??-*.avi)
for prefix (${(Mu)files#???-??-}) encode $prefix*.avi

(или кодировать ${(M)files:#$prefix*})

Эквивалент с оболочкой GNU ( bash), а инструменты будут такими:

while IFS= read -u3 -rd '' prefix; do
  encode "$prefix-"*.avi 3<&-
done 3< <(printf '%s\0' ???-??-*.avi | grep -oz '^...-..-' | sort -zu)

Тот же принцип. Получаем список файлов, соответствующих шаблону ???-??-*.avi в текущем каталоге, извлекаем часть, соответствующую ((M)/grep -o) ???-??- (regexp ...-..-), уникален их ((u)/sort -u), а затем зациклиться на этом списке префиксов.

1
28.01.2020, 02:19

Возможно, не очень умное решение:

  • сортировать файлы по имени
  • циклически перебирать имена
  • сравнивать символы последнего цикла:

     last=""
    лс -1 $1 | сортировать | при чтении файла; делать
    суб=${файл:0:3}
     [ "$last" != "$sub" ] && { echo "НОВАЯ ГРУППА"; последний = "$ под"; }
    эхо "[$sub] $файл"
    Выполнено
     

Вместо эха собирайте имена файлов внутри массива...

Просто идея... пример вывода:

NEW GROUP                                                                                                                                                                                                                                    
[Hi8] Hi8-01-002.avi                                                                                                                                                                                                                         
NEW GROUP                                                                                                                                                                                                                                    
[VHS] VHS-01-001.avi                                                                                                                                                                                                                         
[VHS] VHS-01-002.avi
[VHS] VHS-02-002.avi
NEW GROUP
[XZU] XZU

Редактировать 1: на основе ответа Anthony Geoghegan избегайте труб в начале цикла и используйте подстановку bash. Взгляните на его комментарий.

Улучшенный скрипт:

last=""
for file in *avi; do
    sub=${file:0:3}
    [ "$last" != "$sub" ] && { echo "NEW GROUP"; last="$sub"; }
    echo "[$sub] $file"
done

Редактировать 2:

как спросил @ Tony Tan в его третьем комментарии: здесь вы найдете прямое решение для анализа собранных имен файлов в функцию. Есть много способов сделать это. И у меня нет большого опыта в сценариях bash...;)

#!/bin/bash

SOURCE_DIR="$1"
cd "$SOURCE_DIR" || { echo "could not read dir '$SOURCE_DIR'"; exit 1; }

function parseFiles() {
  echo "parsing files:"
  echo "$1"
}

last=""
declare -a fileGroup

for file in *avi; do
  # first 3 chars of filename
  sub=${file:0:3}

  if test -z "$last"; then
    # last is empty. first loop
    last="$sub"
  elif test "$last" != "$sub"; then
    # new file group detected, parse collected
    parseFiles "${fileGroup[*]}"
    # reset array
    fileGroup=()
    last="$sub"
  fi

  # append name to array
  fileGroup[${#fileGroup[@]}]=$file
done

parseFiles "${fileGroup[*]}"
3
28.01.2020, 02:19

Теги

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