Como enumerar isso corretamente pelas ferramentas do Unix para o pdfjam?

1

Eu preciso da enumeração correta para o comando pdfjam *.pdf --nup 1x1 . Não há nada para a tarefa nos manuais de pdfjam e pdfjoin , por isso estou pensando na abordagem Bash e / ou na abordagem find . Exemplo de falha na saída sem enumeração correta, onde deixei de fora alguma repetição

ls -1 *
10 Heart Disorders.pdf
11 Red Blood Cell Disorders.pdf
...
19 Kidney Disorders.pdf
1 Cell Injury.pdf
20 Lower Urinary Tract and Male Reproductive Disorders.pdf
21 Female Reproductive Disorders and Breast Disorders.pdf
2 Inflammation and Repair.pdf
4 Water.pdf
5a Prematurity and intrauterine growth retardation.pdf
5 Genetic and Developmental Disorders.pdf
6 Environmental Pathology.pdf
...
9 Vascular Disorders.pdf

Saída esperada

1
2 
...
5
5a
... 
10
11
...
20
21

Um desafio é a existência de 5... e 5a... .

SO: Debian 8.7

    
por Léo Léopold Hertz 준영 20.03.2017 / 21:35

1 resposta

4

com zsh :

(LC_ALL=C; pdfjam ./*.pdf(n) --nup 1x1)

funcionaria. (n) é um zsh Qualificador glob para classificação numérica. Na localidade C, "5a " ordena após "5 G" à medida que o espaço é classificado antes de a . Em algumas outras localidades, "a " poderia classificar antes de " G" porque os espaços e maiúsculas e minúsculas seriam ignorados na primeira passagem (e A vem antes de G )

Com outras shells e em sistemas GNU ou compatíveis, você poderia fazer:

printf '%s
printf '%s
readarray -td '' files < <(
  printf '%s
(LC_ALL=C; pdfjam ./*.pdf(n) --nup 1x1)
' [0-9]* | sort -z -k1n -k1,1) pdfjam "${files[@]}" --nup 1x1
' [0-9]* | sort -z -k1n -k1,1 | xargs -r0 sh -c 'pdfjam "$@" --nup 1x1' sh
' ./* | LC_ALL=C sort -t/ -znk2 | xargs -r0 sh -c 'pdfjam "$@" --nup 1x1' sh

Observe que, se a lista de arquivos for muito grande, com a abordagem zsh , você receberia um erro, aqui, ela executaria vários pdfjam , o que provavelmente não é o que você deseja (e poderia permanecer despercebido).

Em vez de usar LC_ALL=C acima para garantir que o espaço seja classificado antes de a , outra abordagem poderia ser ordenar numericamente, mas em empates, classificar lexicalmente (conforme as regras de localidade) apenas no primeiro campo:

printf '%s
printf '%s
readarray -td '' files < <(
  printf '%s%pre%' [0-9]* | sort -z -k1n -k1,1)
pdfjam "${files[@]}" --nup 1x1
' [0-9]* | sort -z -k1n -k1,1 | xargs -r0 sh -c 'pdfjam "$@" --nup 1x1' sh
' ./* | LC_ALL=C sort -t/ -znk2 | xargs -r0 sh -c 'pdfjam "$@" --nup 1x1' sh

Isso permitiria 5a classificar antes de 5B se o caso fosse ignorado para classificação em sua localidade. 05a ainda classificaria antes de 5 .

Com bash 4,4 e acima, você também pode fazer:

%pre%     
por 20.03.2017 / 21:42