Vou sugerir o uso de zsh
em vez de bash
, o que facilitará a obtenção de uma lista recursiva classificada dos novos arquivos desde aab.md
.
#! /bin/zsh -
last_file=aab.md offset_in_last_file=3036 n=500000
new_files=(**/*.(md|org)(N))
new_files=($new_files[(Re)$last_file,-1])
(($#new_files)) && perl -Ci -sne '
$l = length; $go += $l; $o += $l;
if ($go >= $n) {
printf qq(file="%s", line=%d, char-offset=%d\n), $ARGV, $., $o + $n - $go;
exit;
}
$o = 0 if eof' -- -go=-$offset_in_last_file -n=$n ./$^new_files
Para o número de clusters de grafema em vez de caracteres, substitua $l = length
por $l = () = /\X/g
. Por exemplo, é
escrito como U+0065U+0301
é um cluster de grafema expresso com dois caracteres (e 3 bytes em UTF-8), enquanto é um cluster de grafema e um caractere (e 2 bytes) quando escrito como U + 00E9.
Com o bash 4.4+ e o GNU awk
, você poderia fazer algo semelhante para construir o array $new_files
com
shopt -s nullglob extglob globstar
readarray -td '' new_files < <(
printf '%s#! /bin/zsh -
last_file=aab.md offset_in_last_file=3036 n=500000
new_files=(**/*.(md|org)(N))
new_files=($new_files[(Re)$last_file,-1])
(($#new_files)) && perl -Ci -sne '
$l = length; $go += $l; $o += $l;
if ($go >= $n) {
printf qq(file="%s", line=%d, char-offset=%d\n), $ARGV, $., $o + $n - $go;
exit;
}
$o = 0 if eof' -- -go=-$offset_in_last_file -n=$n ./$^new_files
' **/*.@(md|org) |
L=$last_file awk -v RS='shopt -s nullglob extglob globstar
readarray -td '' new_files < <(
printf '%s%pre%' **/*.@(md|org) |
L=$last_file awk -v RS='%pre%' -v ORS='%pre%' '$0 == ENVIRON["L"], 0'
)
' -v ORS='%pre%' '$0 == ENVIRON["L"], 0'
)
Com bash
, você também precisa substituir ./$^new_files
por "${new_files[@]/#/.\/}"
. (Estamos adicionando um prefixo ./
para evitar problemas com nomes de arquivos que começam com -
ou |
, <
, >
, whitespace ...