Объединение каждого n-го файла в папке и удаление использованного

Вы просите меня угадать и установить для него верхнюю границу.

Могу попробовать поделиться своим опытом. Я не говорю, что вы не должны требовать высоких стандартов, я просто хочу реалистично относиться к стандарту, которому в настоящее время соответствует Linux :-).

С вашим объемом ОЗУ, подкачкой и типом хранилища. Если использование оперативной памяти связано с несколькими интерактивными приложениями. Взаимодействие происходит только с одним из них. Вы не оставили операцию запущенной ни в одном из других приложений. А в других приложениях нет большого количества вкладок с анимированной рекламой :). В таком случае, я думаю, вы делаете хорошее замечание! Моя текущая интуиция подсказывает, что необычно 10 минут для того, чтобы система прояснилась и заработала.

Считаю ли я, что вам стоит когда-нибудь подождать 10 минут , надеясь, что курсор мыши заработает и свет диска снова успокоится?

Не совсем так. Если надежда состоит в том, чтобы дождаться, пока графический интерфейс установится и станет пригодным для использования? Если для использования графического интерфейса потребуется даже 2 минуты , и моя цель состоит не только в том, чтобы начать закрывать некоторые окна текущего приложения переднего плана? Вы ожидаете, что эта задержка будет продолжаться снова. Это явно слишком долго.

Но, во-вторых, это может быть связано с различными возможными проблемами. Например, если половина проблемы заключается в параллельной операции во второй программе, о которой я не знаю, то рабочий набор системы может быть больше, чем ОЗУ. В таком случае, да, система может работать больше часов, чем вы можете сосчитать . Таким образом, вы не хотели бы ждать.

Если бы я пытался понять, что происходит не так , мой максимальный тайм-аут мог бы быть 15 минут . Это будет общее время ожидания для получения данных из последовательности, такой как:

  • ctrl + альт + f6
    • Если для переключения на текстовый терминал требуется слишком много времени, используйте alt + sysrq + R и повторите попытку. Имейте в виду, что если вы вернетесь к графическому интерфейсу и когда-либо нажмете ctrl + c , весь графический интерфейс будет уничтожен.
  • войти
  • sudo tmux-текстовый оконный менеджер. Теперь я могу запускать несколько команд от имени пользователя root и переключаться между ними без задержек при входе в систему или sudo.
  • atop -R-я упоминал, что люблю atop?
  • iotop-Ужасные задержки обычно связаны с вводом-выводом. Это хороший инструмент, который делает одну вещь :-).
  • journalctl --since=-1hour -f
  • ...
0
19.08.2021, 10:53
2 ответа

Сzsh:

files=(./input-file*(Nn.) )
typeset -Z3 n=1
while
 (( $#files > 0 )) &&
   cat $files[1,50] > merged-file$n.txt &&
   rm -f $files[1,50]
do
  files[1,50]=()
  ((n++))
done

Там ./input-file*(Nn.)расширяется до файлов, которые соответствуют ./input-file*, но с 3 квалификаторами glob дополнительно классифицируют это:

  • N:nullglob :заставляет глобус расширяться до нуля вместо прерывания с ошибкой при отсутствии совпадений. Это то, что вам часто нужно при установке массива из глобуса, и это нормально, если этот массив в конце будет пустым:
  • n:numericglobsort:изменить сортировку с лексической по умолчанию на числовую (в результате комбинации обоих ), так что input-file2сортирует, например, раньше input-file10.
  • .:ограничиться обычными файлами (игнорировать каталоги, символические ссылки, FIFO...)

typeset -Z3 nделает $nпеременным нулем -, дополненным до ширины 3, поэтому мы получаем merged-file001.txt,... merged-file049.txt...

Затем мы зацикливаемся до тех пор, пока в массиве $filesесть элементы и нет ошибок,объединение пакетов по 50 за раз (и всего, что осталось для последнего пакета ).

То же самое с инструментами bash 4.4+ и GNU:

readarray -td '' files < <(
  LC_ALL=C find. -maxdepth 1 -name 'input-file*' -type f -print0 |
    sort -zV
)
n=0
set -- "${files[@]}"
while
 (( $# > 0 )) &&
   printf -v padded_n %03d "$n" &&
   cat "${@:0:50}" > "merged-file$padded_n.txt" &&
   rm -f "${@:0:50}"
do
  shift "$(( $# >= 50 ? 50 : $# ))"
  ((n++))
done

Где findвыполняет работу zsh ./input-file*(N.), sort -Vвыполняет числовую (версию )сортировку, и мы используем позиционные параметры и shiftв цикле, поскольку bashмассивы довольно ограниченное.

2
20.08.2021, 10:24

Этот скрипт:

  1. Для bash (с тегами ),
  2. Предотвращение поиска (, который завершается с ошибкой на недопустимых символах ),
  3. Убедитесь, что обрабатываются только обычные файлы (нет каталогов ),
  4. Используя sortдля численной (сортировки,по версии )и
  5. Объединение kфайлов (количество переменных)
  6. Удаление одного файла за раз (предотвращение копирования блока файлов, который не будет удален)
dir="myDir"

readarray -td $'\0' files < <(
   for f in./"$dir"/in-file*; do
       if [[ -f "$f" ]]; then printf '%s\0' "$f"; fi
   done |
       sort -zV
)

k=50
rm -f./"$dir"/joined-files*.txt
for i in "${!files[@]}"; do
   n=$((i/k+1))
   cat "${files[i]}"  >>./"$dir"/joined-files$n.txt &&
       rm -f "${files[i]}"
done

0
20.08.2021, 10:24

Теги

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